11

在 MATLAB 和 Numpy 中,数组都可以由数组索引。但是,行为是不同的。让我通过一个例子来解释这一点。

MATLAB:

>> A = rand(5,5)

A =

    0.1622    0.6020    0.4505    0.8258    0.1067
    0.7943    0.2630    0.0838    0.5383    0.9619
    0.3112    0.6541    0.2290    0.9961    0.0046
    0.5285    0.6892    0.9133    0.0782    0.7749
    0.1656    0.7482    0.1524    0.4427    0.8173

>> A([1,3,5],[1,3,5])

ans =

    0.1622    0.4505    0.1067
    0.3112    0.2290    0.0046
    0.1656    0.1524    0.8173

麻木:

In [2]: A = arange(25).reshape((5,5))

In [3]: A
Out[3]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

In [6]: A[[0,2,4], [0,2,4]]
Out[6]: array([ 0, 12, 24])

换句话说:MATLAB 选择行和列,Numpy “压缩”两个索引数组并使用元组指向条目。

如何使用 Numpy 获得 MATLAB 行为?

4

3 回答 3

18

您可以使用辅助函数numpy.ix_来获取 Matlab 行为:

from numpy import ix_
A[ ix_( [0,2,4], [0,2,4] ) ]
于 2012-07-09T11:14:19.303 回答
13

你可以这样做:

A[[0,2,4],:][:,[0,2,4]]

这将给出您想要的类似 MATLAB 的结果。

值得一提的是,如果您使用切片进行索引,那么您将获得类似 MATLAB 的结果,而不需要任何此类骇客:

>>> A[1:3,1:3]
array([[ 6, 7],
       [11,12]])

在 numpy 中,与 MATLAB 不同,1:3它不仅仅是缩写[1,2]或类似的东西。(此时我觉得有必要提及您肯定已经知道的事情,即 Python1:3有点像[1,2],而 MATLAB 有点像[1,2,3]:右侧端点包含在 MATLAB 中,而排除在 Python 中。)

于 2012-07-09T10:52:05.283 回答
1

使用 numpy 执行此操作的有效方法是重塑索引数组以匹配它们索引的轴,即

In [103]: a=numpy.arange(100).reshape(10,10)

In [104]: a
Out[104]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
   [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
   [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
   [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
   [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
   [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
   [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
   [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
   [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
   [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])

In [105]: x=numpy.array([3,6,9])

In [106]: y=numpy.array([2,7,8])

In [107]: a[x[:,numpy.newaxis],y[numpy.newaxis,:]]
Out[107]: 
array([[32, 37, 38],
      [62, 67, 68],
      [92, 97, 98]])

Numpy 的广播规则是你的朋友(而且比 matlab 好得多)......

高温高压

于 2013-07-17T20:21:36.657 回答