使用2D矩阵作为numpy中3D矩阵的索引?

时间:2017-07-26 19:10:30

标签: python numpy matrix

假设我有一个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]])

3 个答案:

答案 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]])