获取调用函数结果的数组有哪些选择? 在给定(对象)数组的每个元素上?
我现在所做的是:
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}时至少制作了一份结果副本}}
答案 0 :(得分:1)
你的方法似乎很合理。我使用np.nditer
尝试了更好的一个,但你的速度仍然是原来的两倍:
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