我很新,numpy
我很难理解如何从np.array
具有定义的列和行的子矩阵中提取:
Y = np.arange(16).reshape(4,4)
如果我想提取列/行 0 和 3,我应该有:
[[0 3]
[12 15]]
我尝试了所有重塑功能......但无法弄清楚如何做到这一点。有任何想法吗?
试一试 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]])
一种解决方案是通过切片/跨步来索引行/列。这是一个示例,您从第一列到最后一列(即第一列和第四列)中每隔三列/行提取一次
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
。
print y[0:4:3,0:4:3]
是最短和最合适的修复。
首先,你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])
您也可以使用以下方法执行此操作:
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),:]
,然后索引到它。
这也可以通过切片来完成: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]]