web-dev-qa-db-ja.com

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
14
Jonathan

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

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

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

2Dをスライスしたい場合list次の関数が役立つ場合があります

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
SKIL

実際、あなたが書いたものはうまくいくはずです...あなたはどのバージョンの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
Joe Kington

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

3
Mac D

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

__getitem__を使用すると、:と複数の引数を使用して好きなことを実行するようにクラスをプログラムできます。

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

より正確に:

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

(1, 2)をリストの__getitem__に渡そうとしていて、組み込みリストはタプル引数を処理するようにプログラムされておらず、整数のみを処理するためです。

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

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

または私は何かが欠けていますか?

0
FartVader