如何在Numpy中使用数组作为自己的索引

时间:2013-01-28 11:26:58

标签: python matrix numpy indices

这适用于MATLAB:

>> p = [1, 0, 2, 4, 3, 6, 5];
>> p(p+1)

ans = 

     0   1   2   3   4   5   6

有没有办法在NumPy中做同样的事情?我无法弄清楚如何:

>>> p = mat([1, 0, 2, 4, 3, 6, 5])
>>> p[p]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 305, in __getitem__
    out = N.ndarray.__getitem__(self, index)
IndexError: index (1) out of range (0<=index<0) in dimension 0
>>> p[:,p]

此时解释器似乎进入了一个无限循环。这也会导致无限循环:

>>> [p[:,i] for i in p]

但这有效:

>>> [p[:,i] for in range(0,6)]

因此,使用矩阵成员作为自己的索引会导致问题。这是Python中的错误吗?或者我做错了什么?

1 个答案:

答案 0 :(得分:5)

只有整数可以用作数组或矩阵索引。初始化的矩阵的默认类型是float。

您可以使用numpy.array而不是numpy.matrix

In [2]: import numpy as np
In [3]: x = np.array([1, 0, 2, 4, 3, 6, 5])
In [4]: x[x]
Out[4]: array([0, 1, 2, 3, 4, 5, 6])

或者您可以明确地将矩阵更改为整数类型:

In [5]: x = np.matrix(x).astype(int)
In [6]: x[0, x]
Out[7]: matrix([[0, 1, 2, 3, 4, 5, 6]])

numpy.matrix是专为2D矩阵设计的专业类。特别是,您不能使用单个整数索引2D矩阵,因为 - 好 - 它是二维的,您需要指定两个整数,因此在第二个示例中需要额外的0索引。