9

私はPythonにかなり慣れておらず、Numpyにも非常に慣れていません。

これまでのところ、リストのリストであるデータのndarrayがあり、インデックスの配列があります。インデックスがインデックスの配列内にあるすべての行を削除し、その行を新しいndarrayに配置するにはどうすればよいですか?

たとえば、私のデータは次のようになります

[[1 1 1 1]
 [2 3 4 5]
 [6 7 8 9]
 [2 2 2 2]]

私のインデックス配列は

[0 2]

2つで2つの配列を取得したいのですが、

[[1 1 1 1]
 [6 7 8 9]]

[[2 3 4 5]
 [2 2 2 2]]

わかりやすくするための拡張例:たとえば、私のデータは次のようになります。

[[1 1 1 1]
 [2 3 4 5]
 [6 7 8 9]
 [2 2 2 2]
 [3 3 3 3]
 [4 4 4 4]
 [5 5 5 5]
 [6 6 6 6]
 [7 7 7 7]]

私のインデックス配列は

[0 2 3 5]

2つで2つの配列を取得したいのですが、

[[1 1 1 1]
 [6 7 8 9]
 [2 2 2 2]
 [4 4 4 4]]

[[2 3 4 5]
 [3 3 3 3]
 [5 5 5 5]
 [6 6 6 6]
 [7 7 7 7]]

numpy.take()とnumpy.choose()を調べましたが、理解できませんでした。ありがとう!

編集:データセットに応じて、入力データとインデックス配列の長さが可変であることも追加する必要があります。可変サイズで機能するソリューションが欲しいのですが。

4

1 に答える 1

15

申し訳ありませんが、あなたは既に持っていてtake、基本的に の反対を必要とtakeしています。

a = np.arange(16).reshape((8,2))
b = [2, 6, 7]
mask = np.ones(len(a), dtype=bool)
mask[b,] = False
x, y = a[b], a[mask] # instead of a[b] you could also do a[~mask]
print x
array([[ 4,  5],
       [12, 13],
       [14, 15]])
print y
array([[ 0,  1],
       [ 2,  3],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])

bしたがって、から選択されない場合はどこでも True であるブール値マスクを作成するだけですa


実際にはnp.split、これを処理するものが既にあります (純粋な python コードですが、それほど気にする必要はありません)。

>>> a = np.arange(16).reshape((8,2))
>>> b = [2, 6]
>>> print np.split(a, b, axis=0) # plus some extra formatting
[array([[0, 1],
       [2, 3]]),
 array([[ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]]),
 array([[12, 13],
       [14, 15]])]

split には常にスライス from0:b[0]とが含まれb[0]:ます。簡単にするために、それらを結果からスライスするだけでよいと思います。もちろん、通常の分割 (すべて同じサイズ) がある場合は、 を使用したほうがよい場合がありますreshape

これはviewsを返すことにも注意してください。したがって、これらの配列を変更すると、.copy最初に呼び出さない限り、元の配列が変更されます。

于 2012-10-26T19:24:46.633 に答える