2016-04-11 16 views
3

値を定義する行と列の関数を指定して、numpyのndarrayを作成したいとします。numpy ndarrayを各行とカラムで呼び出される関数で効率的に埋めるにはどうしたらいいですか?

は例えば、私はこのような何かできるようにしたいと思います(完全に間違った構文を、あなたのアイデアを取得する必要があります):

>>> np.ndarray((2,3), lambda r,c: 3*r+c) 
[[ 0 1 2] 
[ 3 4 5]] 

は、オンライン検索、私が持っていたのに、何も得られませんでしたトラブル...それを検索する方法を正確で今私が持っている

(相当)以下のコードを考えて、それは恐ろしく非効率的です。

残念ながら
def ndarrayFuncFill(size, func): 
    z = np.empty(size) 
    for r in np.arange(size[0]): 
     for c in np.arange(size[1]): 
      z[r][c] = func(r,c) 
    return z 

>>> ndarrayFuncFill((2,3), lambda r,c: 3*r+c) 
array([[ 0., 1., 2.], 
     [ 3., 4., 5.]]) 

、私が特に今のところこれを使用したい機能は、私がufuncまたはそれに類するものとして簡単に書き換えることができないものです。私はかなりそれをブラックボックスとして扱わなければならない。

私が実際にこれを使用することに関心がある機能(上記のラムダほどシンプルではない)は、投稿する許可がありません。ただし、ルックアップテーブルの補間は基本的に行います。だからあなたはそれを行と列にして、それをルックアップテーブルのインデックスに変換しますが、それはちょうど1対1のルックアップではなく、価値観、そしてそのようなもの。だから、最も効率的な機能ではありませんが、ネストされたfor-loopsのような無駄なソースをあまり多く持たないようにしたいと思います。

提案がありますか?

+0

は、なぜあなたは私たちがそれ(または簡略化した例を見ることができる機能を追加しないでください)?また[mcve]を見てください。 – roadrunner66

+0

残念ながら私は正確なコードを投稿する権限はありませんが、質問文に詳細情報を追加します。アドバイスありがとう! –

+0

'lookup'で述べたように編集内容に基づいて、' np.searchsorted'を使うことができます。関連する使用例については、Stackoverflowで検索してください。http://stackoverflow.com/search?q=%5Bnumpy%5D+np.searchsorted – Divakar

答えて

0

具体的な例の中で最も速い解決策はnp.arange(6).reshape(3, 2)です。一般に、1D配列にはnp.vectorizeを使用し、必要に応じて再構成できますが、最適化されていません(「実装は本質的にforループです」)。

+0

です。 2Dよりはるかに速いのですか?)これは、私が上で使用した例を非常に具体的に扱っているようです。残念なことに、これはほんの一例です。とにかくありがとう! –

+2

'np.vectorize'はあまり時間を節約できません。 – hpaulj

+0

@hpaulj合意。 –

1

index arraysを試してみることができます。あなたが何か行うことができnp.indicesを使用して、簡単な例 、:だから

import numpy as np 
r, c = 2, 3 
a = np.empty((r, c)) 
b = np.indices((r, c)) 
a[b[0], b[1]] = 3 * b[0] + b[1] 

その後、我々は持っている:

>>> a 
array([[ 0., 1., 2.], 
     [ 3., 4., 5.]]) 
関連する問題