2

私が配列を持っているとしましょう:

 >>> import numpy as np
 >>> myarr = np.array([[1],[2],[3],[2]])

myarr論理インデックスを使用して、2に等しくないサブ配列を返したいと思います。

 >>> subarr = myarr[myarr != 2]
 >>> print subarr
 [1 3]

したがって、myarr.shape = (4,1)しかしsubarr.shape = (2,)

論理インデックスがディメンション2に影響を与えないのに、ディメンション2のサイズが変更されるのはなぜですか。出力の形状を簡単に変更することもできますが、コードで論理インデックスを頻繁に使用する必要がある場合は、余分なディメンション(つまり、実行している論理スライスに明らかに関係のないディメンション)を常に考慮する必要はありません。それは変わったかもしれません。

この(N、1)->(K、)の例は特に厄介です。これは、1行1列の配列の論理スライスも1行1列の配列でなければならないためです。

NumPyスライス操作で単純な配列の次元をそのままにしておくためのよりクリーンな方法が必要だと思います。助言がありますか?

4

1 に答える 1

2

ブール配列を使用したnumpyのインデックス作成は、array.nonzero()を使用したインデックス作成と同じです。array.nonzero()は2darrayに対して2セットのインデックスを返すため、実際には1次元と2次元の両方でインデックスを作成しています。

>>> myarr = np.array([[1],[2],[3],[2]])
>>> (myarr != 2).nonzero()
(array([0, 2]), array([0, 0]))
>>> myarr[(array([0, 2]), array([0, 0]))]
array([1, 3])

あなたが本当に欲しいのは:

>>> myarr[array([0, 2])]
array([[1],
       [3]])

あなたが得ることができるもの:

>>> myarr[myarr[:,0] != 2]
array([[1],
       [3]])

また:

>>> myarr[(myarr != 2).nonzero()[0]]
array([[1],
       [3]])
于 2012-04-12T21:24:50.440 に答える