3

我正在寻找一种 Numpy(即希望更快)的方式来执行以下操作:

import numpy as np                                                              

x = np.array([1,2,3,4,5],dtype=np.double)                                       
arr = [[1,2],[0,4,3],[1,4,0],[0,3,4],[1,4]]                                 

ans = np.array([ x[item] - x[i] for i, item in enumerate(arr) ])

我想摆脱列表理解并做这样的事情(虽然,我知道这行不通)

x[arr[:]] - x[:]

arr始终是长度等于 的长度的整数的嵌套列表x。内部列表的长度不一定相同(即arr是一个参差不齐的列表)

4

1 回答 1

0

我已经提出了一个足以满足我使用 Numpy 掩码数组的应用程序的解决方案。在我的应用程序中,arr列表不是“过于粗糙”(即任何内部列表的最大长度与任何内部列表的最小长度没有太大区别)。arr因此,我先用s填充-1,然后根据 s 的位置创建掩码-1。我执行我的操作并在结果数组上使用掩码。在这种情况下,有一些额外的计算是不必要的(在填充的条目上),但这仍然比 Python 循环更快(几乎是 2 倍)。示例代码如下:

import numpy as np                                                              
import numpy.ma as ma

x = np.array([1,2,3,4,5],dtype=np.double)                                       
arr = [[1,2],[0,4,3],[1,4,0],[0,3,4],[1,4]]                                     

max_arr_length = max([ len(item) for item in arr ])                          

arr_padded = [ np.pad(i,(0,max_arr_length-len(i)), mode='constant', 
    constant_values=-1) for i in arr ]
arr_masked = ma.masked_equal(arr_padded,-1)

ans_masked = ma.masked_array(x[arr_masked] - x[:, None], mask=arr_masked.mask)

这有点骇人听闻,但对我来说效果很好。如果 Numpy 支持不规则数组就好了。

于 2013-01-02T15:19:46.770 回答