2013-10-03 193 views
26

我在numpy相当新的,我有一个很难理解如何从np.array提取与定义的列和行的子矩阵:NumPy的提取小矩阵

Y = np.arange(16).reshape(4,4) 

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

[[0 3] 
[12 15]] 

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

+3

只是为了澄清,你所要求的是你想要的输出是列/行0和3 – JoshAdel

回答

35

np.ix_一试:

Y[np.ix_([0,3],[0,3])] 

这将返回您期望的结果:

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]]) 
+0

是的这就是它! – user1595929

+2

@ user1595929如果您认为这是最佳解决方案并正确回答您的原始问题,请将其视为已接受。 – JoshAdel

10

一种解决方案是指数切片/迈进的行/列。在这里你是提取第一每三列/行到最后一列的例子(即第一和第四列)

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

这给了你,你要找的输出。

欲了解更多信息,请查看this page on indexing in NumPy

+0

我喜欢这个答案,因为符号与matlab的符号相似 –

3

首先,您的Y只有4列和行,所以没有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])

4

你也可以做到这一点使用:

Y[[[0],[3]],[0,3]] 

这相当于做这个使用索引阵列:

idx = np.array((0,3)).reshape(2,1) 
Y[idx,idx.T] 

为了使广播工作根据需要,你需要你的索引阵列的非单维度与你进行索引轴线对齐,例如对于n×m个二维子阵列:

Y[<n x 1 array>,<1 x m array>] 

这并不创建中间阵列,不象CT诸的回答,它创建中间阵列Y[(0,3),:],然后进入它的索引。

2
print y[0:4:3,0:4:3] 

是最短和最合适的修复方法。