1. ホーム
  2. python

[解決済み] Pythonのリストをnumpyの配列にコピーするときに、TypeError: list indices must be integers, not tupleを防ぐにはどうしたらいいですか?

2022-03-10 02:42:33

質問

mean_dataという別の配列のデータを使って、以下のように3つのnumpyの配列/リストを作成しようとしています。

---> 39 R = np.array(mean_data[:,0])
     40 P = np.array(mean_data[:,1])
     41 Z = np.array(mean_data[:,2])

プログラムを実行しようとすると、エラーが表示されます。

TypeError: list indices must be integers, not tuple

mean_dataのリストは、このサンプルのようになります...。

[6.0, 315.0, 4.8123788544375692e-06],
[6.5, 0.0, 2.259217450023793e-06],
[6.5, 45.0, 9.2823565008402673e-06],
[6.5, 90.0, 8.309270169336028e-06],
[6.5, 135.0, 6.4709418114245381e-05],
[6.5, 180.0, 1.7227922423558414e-05],
[6.5, 225.0, 1.2308522579848724e-05],
[6.5, 270.0, 2.6905672894824344e-05],
[6.5, 315.0, 2.2727114437176048e-05]]

このエラーを防ぐ方法がわかりません。np.arrayとしてmean_dataを作成し、np.appendを使って値を追加してみましたが、それも問題を解決していません。

以下はそのトレースバックです(以前はipythonを使用していました)。

Traceback (most recent call last):
  File "polarplot.py", line 36, in <module>
    R = np.array(mean_data[:,0])
TypeError: list indices must be integers, not tuple

そして、もう一つの方法として私が試したのは、配列の作成です。

mean_data = np.array([])

for ur, ua in it.product(uradius, uangle):
    samepoints = (data[:,0]==ur) & (data[:,1]==ua)
    if samepoints.sum() > 1:  # check if there is more than one match
        np.append(mean_data[ur, ua, np.mean(data[samepoints,-1])])
    elif samepoints.sum() == 1:
        np.append(mean_data, [ur, ua, data[samepoints,-1]])

その際のトレースバックは

IndexError                                Traceback (most recent call last)
<ipython-input-3-5268bc25e75e> in <module>()
     31     samepoints = (data[:,0]==ur) & (data[:,1]==ua)
     32     if samepoints.sum() > 1:  # check if there is more than one match
---> 33         np.append(mean_data[ur, ua, np.mean(data[samepoints,-1])])
     34     elif samepoints.sum() == 1:
     35         np.append(mean_data, [ur, ua, data[samepoints,-1]])

IndexError: invalid index

解決方法は?

変数 mean_data はネストしたリストです。Pythonではネストしたリストへのアクセスは多次元スライシングではできません、すなわち mean_data[1,2] 代わりに、次のように書きます。 mean_data[1][2] .

これは、以下の理由からです。 mean_data[2] はリストです。さらにインデックスの作成は再帰的に行われます。 mean_data[2] はリストです。 mean_data[2][0] はそのリストの最初のインデックスです。

さらに mean_data[:][0] は機能しません。 mean_data[:]mean_data .

解決策としては、以下のように、配列を置き換えるか、元のデータをインポートすることです。

mean_data = np.array(mean_data)

numpyの配列は(MATLABの配列のように、また入れ子リストとは異なり)タプルを使った多次元スライスをサポートします。