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
エラーはそれを明示的に示しています:データはnumpy配列ではなく、リストのリストです。
最初にそれをnumpy配列に変換してみてください:
numpy.array(data)[:,[0,2]]
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]]
実際、あなたが書いたものはうまくいくはずです...あなたはどのバージョンの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]])
必要に応じて...
これはあなたが探しているものではないかもしれませんが、これはそうでしょう。 Zip(* x)[必要な列は何でも]
Numpyでは機能するがPythonリストでは機能しない理由
__getitem__
を使用すると、:
と複数の引数を使用して好きなことを実行するようにクラスをプログラムできます。
Numpyはこれを行いますが、組み込みのlist
sは行いません。
より正確に:
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))]
かなり醜いですが、機能します。
newArray = data[:,0:2]
または私は何かが欠けていますか?