这适用于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中的错误吗?或者我做错了什么?
答案 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索引。