Numpy提取子矩阵

use*_*929 42 python numpy

我很新,numpy我很难理解如何从np.array定义的列和行的子矩阵中提取:

Y = np.arange(16).reshape(4,4)
Run Code Online (Sandbox Code Playgroud)

如果我想提取列/行0和3,我应该:

[[0 3]
 [12 15]]
Run Code Online (Sandbox Code Playgroud)

我尝试了所有重塑功能......但无法弄清楚如何做到这一点.有任何想法吗?

Jos*_*del 69

np.ix_一试:

Y[np.ix_([0,3],[0,3])]
Run Code Online (Sandbox Code Playgroud)

这将返回您想要的结果:

In [25]: Y = np.arange(16).reshape(4,4)
In [26]: Y[np.ix_([0,3],[0,3])]
Out[26]:
array([[ 0,  3],
       [12, 15]])
Run Code Online (Sandbox Code Playgroud)

  • @ user1595929如果您认为这是最佳解决方案并正确回答原始问题,请将其视为已接受. (3认同)

mdm*_*dml 14

一种解决方案是通过切片/跨步来索引行/列.这是一个示例,您从第一列到最后一列(即第一列和第四列)中提取每第三列/行

In [1]: import numpy as np
In [2]: Y = np.arange(16).reshape(4, 4)
In [3]: Y[0:4:3, 0:4:3]
Out[1]: array([[ 0,  3],
               [12, 15]])
Run Code Online (Sandbox Code Playgroud)

这为您提供了所需的输出.

有关详细信息,请查看有关索引的此页面NumPy.


Him*_*ima 7

print y[0:4:3,0:4:3]
Run Code Online (Sandbox Code Playgroud)

是最短和最合适的修复.


CT *_*Zhu 6

首先,你Y只有4个col和row,所以没有col4或row4,最多col3或row3.

获得0,3个cols:Y[[0,3],:] 获得0,3行:Y[:,[0,3]]

所以要获得你要求的数组: Y[[0,3],:][:,[0,3]]

请注意,如果你只是Y[[0,3],[0,3]]等价,[Y[0,0], Y[3,3]]结果将是两个元素:array([ 0, 15])


ali*_*i_m 6

你也可以这样做:

Y[[[0],[3]],[0,3]]
Run Code Online (Sandbox Code Playgroud)

这相当于使用索引数组执行此操作:

idx = np.array((0,3)).reshape(2,1)
Y[idx,idx.T]
Run Code Online (Sandbox Code Playgroud)

要使广播按需工作,您需要将索引数组的非单一维度与要索引的轴对齐,例如对于nxm 2D子阵列:

Y[<n x 1 array>,<1 x m array>]
Run Code Online (Sandbox Code Playgroud)

这不会创建一个中间数组,这与CT Zhu的答案不同,后者创建了中间数组Y[(0,3),:],然后将其编入索引.