如何在2d数组中选择特定的行和列

时间:2015-10-09 02:47:24

标签: python python-3.x numpy

如果我有一个二维数组,如

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

如何使用参数选择row = [0, 2]column = [0, 2]? 在MATLAB中,我可以简单地执行A[row, column],但在python中,这将选择对应于(0,0)和(2,2)的2个元素。

无论如何,我可以使用MATLAB中的一些参数来做到这一点吗? 输出应该是这样的 [0 2

8 10]

3 个答案:

答案 0 :(得分:1)

您可以使用以下

A = np.arange(16).reshape(4,4)
print np.ravel(A[row,:][:,column])

得到:

array([ 0,  2,  8, 10])

答案 1 :(得分:1)

MATLAB在使用维度的向量进行索引时会创建2D网格。所以,在MATLAB中,你会有 -

A =
     0     1     2     3
     4     5     6     7
     8     9    10    11
    12    13    14    15
>> row = [1, 3]; column = [1, 3];
>> A(row,column)
ans =
     0     2
     8    10

现在,在NumPy / Python中,使用维度中的向量进行索引会在从这些向量中的每个元素生成连音符之后选择元素。要复制MATLAB行为,您需要从向量创建此类索引的网格。同样,您可以使用np.meshgrid -

In [18]: A
Out[18]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [19]: row = [0, 2]; column = [0, 2];

In [20]: C,R = np.meshgrid(row,column)

In [21]: A[R,C]
Out[21]: 
array([[ 0,  2],
       [ 8, 10]])

答案 2 :(得分:1)

要选择一个元素块 - 就像MATLAB一样,第一个索引必须是列向量。有几种方法可以做到这一点:

In [19]: A = np.arange(16).reshape(4,4)
In [20]: row=[0,2];column=[0,2]

In [21]: A[np.ix_(row,column)]
Out[21]: 
array([[ 0,  2],
       [ 8, 10]])
In [22]: np.ix_(row,column)
Out[22]: 
(array([[0],
        [2]]), array([[0, 2]]))

In [23]: A[[[0],[2]],[0,2]]
Out[23]: 
array([[ 0,  2],
       [ 8, 10]])

另一个答案使用meshgrid。我们可以列出六种变体。

本节中的文档很好: http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#purely-integer-array-indexing