59

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

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

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

[[0 3]
 [12 15]]

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

4

6 回答 6

98

试一试 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]])
于 2013-10-03T14:18:40.867 回答
18

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

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

这为您提供了您正在寻找的输出。

有关更多信息,请查看有关索引 in 的页面NumPy

于 2013-10-03T14:18:44.613 回答
12
print y[0:4:3,0:4:3]

是最短和最合适的修复。

于 2014-07-16T14:46:32.850 回答
7

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

获取Y[[0,3],:] 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])

于 2013-10-03T14:19:18.093 回答
6

您也可以使用以下方法执行此操作:

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

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

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

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

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

这不会创建中间数组,不像 CT Zhu 的答案,它创建中间数组Y[(0,3),:],然后索引到它。

于 2013-10-03T23:41:30.497 回答
0

这也可以通过切片来完成:Y[[0,3],:][:,[0,3]]. 更优雅的是,可以通过给定的行、列、页面等索引集对数组进行切片(甚至重新排序):

r=np.array([0,3])
c=np.array([0,3])
print(Y[r,:][:,c]) #>>[[ 0  3][12 15]]

重新排序试试这个:

r=np.array([0,3])
c=np.array([3,0])
print(Y[r,:][:,c])#>>[[ 3  0][15 12]]
于 2021-02-15T19:56:45.660 回答