如果我有一个2d数组,比如
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]要选择元素块-如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
您可以使用以下
A = np.arange(16).reshape(4,4)
print np.ravel(A[row,:][:,column])
:
array([ 0, 2, 8, 10])
MATLAB
创建二维网格时,索引的向量跨维度。在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中,跨维度的向量索引选择从这些向量中的每个元素创建tuplets后的元素。为了复制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]])