【发布时间】:2013-10-10 06:55:19
【问题描述】:
我是numpy 的新手,我很难理解如何从np.array 中提取具有已定义列和行的子矩阵:
Y = np.arange(16).reshape(4,4)
如果我想提取第 0 和第 3 列/行,我应该:
[[0 3]
[12 15]]
我尝试了所有的重塑功能...但无法弄清楚如何做到这一点。有什么想法吗?
【问题讨论】:
我是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]])
这将为您提供您正在寻找的输出。
欲了解更多信息,请查看this page on indexing in NumPy。
【讨论】:
print y[0:4:3,0:4:3]
是最短且最合适的修复方法。
【讨论】:
首先,你的Y只有4个col和rows,所以没有col4或row4,最多col3或row3。
要获得 0、3 列: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])
【讨论】:
您也可以使用:
Y[[[0],[3]],[0,3]]
这相当于使用索引数组:
idx = np.array((0,3)).reshape(2,1)
Y[idx,idx.T]
要使广播按需要工作,您需要索引数组的非单一维度与您要索引到的轴对齐,例如对于一个 n x m 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]]
【讨论】: