我正在寻找一种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
是一个参差不齐的列表)
答案 0 :(得分:0)
我已经提出了一个适合我的应用程序使用Numpy蒙面数组的解决方案。在我的应用程序中,arr
列表不是“太粗糙”(即任何内部列表的最大长度与任何内部列表的最小长度没有太大差别)。因此,我首先使用arr
填充-1
,然后根据-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支持不规则阵列,那就好了。