假设我有一个2x3x3形状的数组,这是一个3D矩阵。我还有一个形状为3x3的2D矩阵,我想用它作为沿第一轴的3D矩阵的索引。示例如下。
示例运行:
>>> np.random.randint(0,2,(3,3)) # index
array([[0, 1, 0],
[1, 0, 1],
[1, 0, 0]])
>> np.random.randint(0,9,(2,3,3)) # 3D matrix
array([[[4, 4, 5],
[2, 6, 7],
[2, 6, 2]],
[[4, 0, 0],
[2, 7, 4],
[4, 4, 0]]])
>>> np.array([[4,0,5],[2,6,4],[4,6,2]]) # result
array([[4, 0, 5],
[2, 6, 4],
[4, 6, 2]])
答案 0 :(得分:8)
您似乎使用rundll dfshim CleanOnlineAppCache
数组作为索引数组和2D
数组来选择值。因此,您可以使用NumPy的advanced-indexing
-
3D
如果您打算使用# a : 2D array of indices, b : 3D array from where values are to be picked up
m,n = a.shape
I,J = np.ogrid[:m,:n]
out = b[a, I, J] # or b[a, np.arange(m)[:,None],np.arange(n)]
来代替最后一个轴,只需将a
移到那里:a
。
示例运行 -
b[I, J, a]
答案 1 :(得分:1)
如果你的矩阵比3x3大得多,那么np.ogrid
中涉及的内存是一个问题,如果索引保持二进制,你也可以这样做:
np.where(a, b[1], b[0])
但除了那个角落的情况(或者如果你喜欢代码打高尔夫球的单线),另一个答案可能更好。
答案 2 :(得分:0)
有一个现成的numpy函数:np.choose。 它还带有一些便捷的广播选项。
import numpy as np
cube = np.arange(27).reshape((3,3,3))
sel = np.array([[1, 0, 1], [0, 2, 1], [0,2,0]])
the_selection = np.choose(sel, cube)
>>>the_selection
array([[ 9, 1, 11],
[ 3, 22, 14],
[ 6, 25, 8]])