我很新,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)
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.
首先,你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])
你也可以这样做:
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),:],然后将其编入索引.