gpt4 book ai didi

python - 在索引数组 Numpy 中广播

转载 作者:行者123 更新时间:2023-11-28 19:25:27 25 4
gpt4 key购买 nike

我正在寻找一种 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 是一个参差不齐的列表)

最佳答案

我想出了一个解决方案,足以满足我使用 Numpy 掩码数组的应用程序。在我的应用程序中,arr 列表不是“太参差不齐”(即任何内部列表的最大长度与任何内部列表的最小长度没有太大区别)。因此,我首先用 -1 填充 arr,然后根据 -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)

这有点hack,但对我来说效果很好。如果 Numpy 支持参差不齐的数组,那就太好了。

关于python - 在索引数组 Numpy 中广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14104844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com