2

特定の (オブジェクト) 配列の各要素に対して関数を呼び出した結果である配列を取得するためのオプションは何ですか?

私が今していることは次のとおりです。

object_array # an array whose elements are objects
result_array=scipy.reshape( [o.f() for o in object_array.flat], object_array.shape )

私の場合は、分布のパラメータが要素ごとに異なる のobject_array[i,j]インスタンスであることに似ています。scipy.stats.normそしてscipy.stats.norm.rvs()f()私が呼びたいのはです。のサイズはobject_array非常に大きくなる可能性があることに注意してください (最大約 1000x1000) ので、 を呼び出したときに少なくとも 1 つの結果のコピーを作成しているという点で、これが最適ではないことが懸念されますreshape

4

1 に答える 1

1

あなたのアプローチは非常に合理的です。私はより良いものを使用してみましたnp.nditerが、あなたのものはまだ2倍高速です:

import numpy as np
class Foo():
    def foo(self):
        return np.random.random()

a = np.empty((10,10), dtype=object)
for ind,v in np.ndenumerate(a):
    a[ind] = Foo()

def evaluate_and_reshape(a, shape):
    it = np.nditer( op    = [a.reshape(shape),None],
                    flags = ['multi_index','refs_ok'],
                    op_flags = [['readonly'],
                                ['writeonly','allocate']],
                    op_dtypes = [object, float],
                    itershape = (shape)
                  )
    while not it.finished:
        ind = it.multi_index
        it.operands[1][ind] = it.operands[0][ind].foo()
        it.iternext()
    return it.operands[1]

def sol1():
    return evaluate_and_reshape(a,(20,5))

def sol2():
    return np.reshape( [o.foo() for o in a.flat], (20,5) )

タイミング:

timeit sol1()
#10000 loops, best of 3: 110 us per loop
timeit sol2()
#10000 loops, best of 3: 54.8 us per loop
于 2013-08-01T17:35:09.527 に答える