从大型 numpy 数组中快速选择点

Rapid Selection of points from large numpy array

最小示例:

import numpy as np

list1 = [1,3,5,7]
list2 = [3,6,9,4]
list3 = [6,5,3,2]


arr = np.random.rand(72,22,22)

pos_list = np.vstack([list1, list2, list3]).T
print(pos_list)

arr[pos_list[0][0], pos_list[0][1], pos_list[0][2]]

for i in pos_list:
    print(arr[i[0], i[1], i[2]])

我和我的同事正在尝试提高上述选点的效率。生成了很多非常大的矩阵,从这些矩阵中,有很多特定的点必须被提取出来。

在上面的代码中,第一个被选中的点是(list1[0], list2[0], list3[0])。这一直持续到到达(更大的)列表的末尾。

是否有矢量化的方法来解决这个问题——一种避免使用 for 循环的方法——因为这个特定的操作必须执行很多次? 或者几乎任何比上述 for 循环更有效的方法?

我相信这可以满足您的需求,另请参阅 here:

pos_array = np.array(pos_list)
arr[pos_array[:,0], pos_array[:,1],pos_array[:,2]]

输出:

array([0.10539037, 0.17852727, 0.18794522, 0.04191294])

或者,您也可以直接创建列表数组,跳过 vstack 和转置:

import numpy as np

list1 = [1,3,5,7]
list2 = [3,6,9,4]
list3 = [6,5,3,2]
pos_array = np.array([list1,list2,list3])

arr = np.random.rand(72,22,22)

arr[pos_array[0], pos_array[1], pos_array[2]]

输出:

array([0.10539037, 0.17852727, 0.18794522, 0.04191294])