2013-07-30 16 views
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),所以我擔心這是次優的,因爲我在撥打reshape時至少要複製一份結果。

+1

退房'np.vectorize'(或'scipy.vectorize'你的情況) – wim

+0

要使用vectorize您需要將.f()函數調用存儲在未附加到類實例的變量中。 func_ref = TypeOfO.f then new_fun = scipy.vectorize(func_ref)then new_fun(object_array) – Hammer

回答

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 
相關問題