通过索引阵列进行广播

2024-04-20 05:58:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种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) ])

我想摆脱列表理解,像这样做(尽管,我知道这行不通)

^{pr2}$

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


Tags: 方法inimportnumpy列表forasnp
1条回答
网友
1楼 · 发布于 2024-04-20 05:58:20

我已经提出了一个解决方案,它足够我的应用程序使用Numpy掩码数组。在我的应用程序中,arr列表并不是“太粗糙”(也就是说,任何内部列表的最大长度与任何内部列表的最小长度没有太大差别)。因此,我首先用-1s填充arr,然后根据-1s的位置创建一个掩码。我执行我的操作并在结果数组上使用掩码。在本例中,有一些不必要的额外计算(在填充的条目上),但这仍然比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支持参差不齐的数组,那就太好了。在

相关问题 更多 >