从大型 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])
最小示例:
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])