2D Python配列をスライスする方法は? 失敗:「TypeError:リストのインデックスはタプルではなく整数でなければなりません」

multidimensional-array numpy python
2D Python配列をスライスする方法は? 失敗:「TypeError:リストのインデックスはタプルではなく整数でなければなりません」

私はnumpyモジュールに次のような2D配列を持っています:

data = array([[1,2,3],
              [4,5,6],
              [7,8,9]])

要素の特定の列のみを含むこの配列のスライスを取得したい。 たとえば、列0と2が必要な場合があります。

data = [[1,3],
        [4,6],
        [7,9]]

これを行う最もPython的な方法は何ですか? (forループなし)

私はこれがうまくいくと思いました:

newArray = data[:,[0,2]]

しかし、結果は次のとおりです。

TypeError: list indices must be integers, not tuple

  13  3


ベストアンサー

エラーは明示的にそれを言います:データはnumpy配列ではなくリストのリストです。

最初にそれをnumpy配列に変換してみてください:

numpy.array(data)[:,[0,2]]

16


2D *リスト*をスライスしたい場合は、次の関数が役立ちます

def get_2d_list_slice(self, matrix, start_row, end_row, start_col, end_col):
    return [row[start_col:end_col] for row in matrix[start_row:end_row]]

7


実際、あなたが書いたものはうまく機能するはずです…​ numpyのどのバージョンを使用していますか?

確認するために、次はnumpyの最近のバージョンで完全に動作するはずです:

import numpy as np
x = np.arange(9).reshape((3,3)) + 1
print x[:,[0,2]]

私にとって、これは以下をもたらします:

array([[1, 3],
       [4, 6],
       [7, 9]])

あるべき…​

5


これはあなたが探しているものではないかもしれませんが、これはそうでしょう。 zip(* x)[必要な列は何でも]

3


  • Numpyでは機能するがPythonリストでは機能しない理由*

getitem`を使用すると、クラスをプログラムして、: `と複数の引数を使用して任意の処理を実行できるためです。

Numpyはこれを行いますが、組み込みの `list`は行いません。

より正確に:

class C(object):
    def __getitem__(self, k):
        return k

# Single argument is passed directly.
assert C()[0] == 0

# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)

# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)

# If you omit any part of the slice notation, it becomes None.
assert C()[:] == slice(None, None, None)
assert C()[::] == slice(None, None, None)
assert C()[1::] == slice(1, None, None)
assert C()[:2:] == slice(None, 2, None)
assert C()[::3] == slice(None, None, 3)

# Tuple with a slice object:
assert C()[:, 1] == (slice(None, None, None), 1)

# Ellipsis class object.
assert C()[...] == Ellipsis

次に、スライスオブジェクトを次のように開くことができます。

s = slice(1, 2, 3)
assert s.start == 1
assert s.stop == 2
assert s.step == 3

だから、あなたが書くとき:

[][1, 2]

Pythonは言う:

TypeError: list indices must be integers, not tuple

あなたはリストの getitem`に(1、2) `を渡そうとしており、組み込みリストはタプル引数を扱うようにプログラムされておらず、整数だけを扱っているからです。

2


numpyは、各要素に対して同じサイズの通常の配列のみを受け入れることに注意してください。 どういうわけか使用できます: `[a [i] [0:2] for i in xrange(len(a))]`それはかなりいですが、動作します。

1


newArray = data[:,0:2]

それとも何かが足りない?

0


タイトルとURLをコピーしました