Python 2.7 基于三维阵列的高效Numpy切片
我试图找到最有效的方法来为3D numpy阵列进行切片。这是数据的一个子集,仅用于测试目的:Python 2.7 基于三维阵列的高效Numpy切片,python-2.7,numpy,Python 2.7,Numpy,我试图找到最有效的方法来为3D numpy阵列进行切片。这是数据的一个子集,仅用于测试目的: in_arr =np.array([[[0,1,2,5],[2,3,2,6],[0,1,3,2]],[[1,2,3,4],[3,1,0,5],[2,4,0,1]]]) indx =[[3,1,2],[2,0,1]] 我需要得到indx的值,如前所述。例如,indx[0][0]是3,因此我要查找in_arr[0][0]的第三个元素,在本例中为5 我有下面的代码可以完成我需要它做的事情,但是时间复杂度是n
in_arr =np.array([[[0,1,2,5],[2,3,2,6],[0,1,3,2]],[[1,2,3,4],[3,1,0,5],[2,4,0,1]]])
indx =[[3,1,2],[2,0,1]]
我需要得到indx的值,如前所述。例如,indx[0][0]是3,因此我要查找in_arr[0][0]的第三个元素,在本例中为5
我有下面的代码可以完成我需要它做的事情,但是时间复杂度是n^2,我对此不满意
list_in =[]
for x in range(len(indx)):
arr2 = []
for y in range(len(indx[x])):
arr2.append(in_arr[x][y][indx[x][y]])
#print in_arr[x][y][indx[x][y]]
list_in.append(arr2)
print list_in
我正在寻找一种非常快速有效的方法来为大型数据集执行相同的任务 您可以使用广播的索引数组高效地执行此操作;例如:
i1 = np.arange(2)[:, np.newaxis]
i2 = np.arange(3)[np.newaxis, :]
i3 = np.array(indx)
in_arr[i1, i2, i3]
# array([[5, 3, 3],
# [3, 3, 4]])
numpy在这里所做的是有效地匹配三个索引数组的条目,并从_arr中提取相关条目:
[:,np.newaxis]
和[np.newaxis,:]
术语的原因是它通过numpy的规则重新塑造三个数组以使其兼容。真正的答案是,稍微改进一下你的例子。例如,为您的任务添加一个完整的预期输出。是的,我正在看这个,现在我理解了。非常感谢你的帮助。