3

これは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のバグですか?それとも私は何か間違ったことをしていますか?

4

1 に答える 1

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]])

Anumpy.matrixは、2D行列用に設計された特殊なクラスです。特に、2Dマトリックスを単一の整数でインデックス付けすることはできません。これは、2次元であり、2つの整数を指定する必要があるため、2番目の例では追加の0インデックスが必要になるためです。

于 2013-01-28T11:29:23.980 に答える