Python 在numpy中索引行和列

Python 在numpy中索引行和列,python,numpy,Python,Numpy,说我想要中间的正方形。这样做似乎是合理的: a = np.array(list(range(16).reshape((4,4)) array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) 但我明白了: a[[1,2],[1,2]] 这是可行的,但似乎不雅观: array([5, 10]) 因此,我的问题是: 为什么是这样?要使实施的方式合理,需要什

说我想要中间的正方形。这样做似乎是合理的:

a = np.array(list(range(16).reshape((4,4))
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
但我明白了:

a[[1,2],[1,2]]
这是可行的,但似乎不雅观:

array([5, 10])
因此,我的问题是:

为什么是这样?要使实施的方式合理,需要什么前提? 是否有一种规范的方法可以同时选择多个索引?
您可以同时执行两个切片操作,而无需再次创建视图和索引:

将numpy作为np导入 a=np.arange16.4 如有可能,优先考虑 printa[1:3,1:3] [[ 5 6] [ 9 10]] 否则,向第一个索引添加第二个维度以使其可广播 index1=np.asarray[1,2] index2=np.asarray[1,2] printa[index1[:,无],index2] [[ 5 6] [ 9 10]]
我想你可以读到更多的细节。基本上,当您按列表/数组对数组进行切片时,这些数组将一起广播和迭代

在您的情况下,您可以执行以下操作:

a[[1,2],:][:,[1,2]]
array([[5, 6],
       [9, 10]])
或如上述文件所示:

idx = np.array([1,3])
a[idx,idx[:,None]]
输出:

a[np.ix_(idx, idx)]
a.take(idx, axis=1).take(idx, axis=0)
可以使用“多个”从多个轴中选择索引

array([[ 5, 13],
       [ 7, 15]])
或者更具可读性

a = np.arange(16).reshape((4, 4))
idx = np.array([1,2])
np.take(np.take(a, idx, axis=1), idx, axis=0)
输出:

a[np.ix_(idx, idx)]
a.take(idx, axis=1).take(idx, axis=0)

np.take还允许您方便地环绕出界索引等。

对,我的实际用例涉及使用整数数组进行索引,如问题中所述。我编辑了我的问题以反映抱歉,当时误解了你的问题。将更新应答器当使用列表或实际数组编制索引时,数组将相互广播。x[[1,2],[1,2]]选择对角线上的点1,1和2,2。x[[1],[2],[1,2]]选择块。在MATLAB中,块的索引更简单,但“对角线”更笨拙。