3

私はこれらのスレッドを通過しました:

そして、それらはすべて、一意の行と列を持つ行列を計算するためのいくつかの方法について説明しています.

ただし、少なくとも訓練を受けていない目には、ソリューションは少し複雑に見えます。たとえば、最初のスレッドのトップ ソリューションを次に示します (間違っている場合は修正してください)。これが最も安全で最速だと思います。

np.unique(a.view(np.dtype((np.void, a.dtype.itemsize*a.shape[1])))).view(a.dtype).reshape(-1, 
a.shape[1])

いずれにせよ、上記のソリューションは一意の行のマトリックスのみを返します。私が探しているのは、元の機能に沿ったものですnp.unique

u, indices = np.unique(a, return_inverse=True)

これは、一意のエントリのリストだけでなく、見つかった一意の各エントリへの各アイテムのメンバーシップも返しますが、列に対してこれを行うにはどうすればよいですか?

これが私が探しているものの例です:

array([[0, 2, 0, 2, 2, 0, 2, 1, 1, 2],
       [0, 1, 0, 1, 1, 1, 2, 2, 2, 2]])

次のようになります。

u       = array([0,1,2,3,4])
indices = array([0,1,0,1,1,3,4,4,3])

の異なる値はu、元の配列の一意の列のセットを表します。

0 -> [0,0]
1 -> [2,1]
2 -> [0,1]
3 -> [2,2]
4 -> [1,2]
4

3 に答える 3

3

まず、一意のインデックスを取得します。そのためには、配列を転置することから始める必要があります。

>>> a=a.T

上記の修正版を使用して一意のインデックスを取得します。

>>> ua, uind = np.unique(np.ascontiguousarray(a).view(np.dtype((np.void,a.dtype.itemsize * a.shape[1]))),return_inverse=True)

>>> uind
array([0, 3, 0, 3, 3, 1, 4, 2, 2, 4])

#Thanks to @Jamie
>>> ua = ua.view(a.dtype).reshape(ua.shape + (-1,))
>>> ua
array([[0, 0],
       [0, 1],
       [1, 2],
       [2, 1],
       [2, 2]])

正気のために:

>>> np.all(a==ua[uind])
True

チャートを再現するには:

>>> for x in range(ua.shape[0]):
...     print x,'->',ua[x]
...
0 -> [0 0]
1 -> [0 1]
2 -> [1 2]
3 -> [2 1]
4 -> [2 2]

あなたが求めていることを正確に行うには、配列を変換する必要がある場合は少し遅くなります:

>>> b=np.asfortranarray(a).view(np.dtype((np.void,a.dtype.itemsize * a.shape[0])))
>>> ua,uind=np.unique(b,return_inverse=True)
>>> uind
array([0, 3, 0, 3, 3, 1, 4, 2, 2, 4])
>>> ua.view(a.dtype).reshape(ua.shape+(-1,),order='F')
array([[0, 0, 1, 2, 2],
       [0, 1, 2, 1, 2]])

#To return this in the previous order.
>>> ua.view(a.dtype).reshape(ua.shape + (-1,))
于 2013-08-12T22:35:47.370 に答える
2

基本的に、np.unique が一意の列のインデックスと、それらが使用されている場所のインデックスを返すようにしたいですか? これは、行列を転置してから、他の質問のコードに を追加して使用するだけで簡単に実行できますreturn_inverse=True

at = a.T
b = np.ascontiguousarray(at).view(np.dtype((np.void, at.dtype.itemsize * at.shape[1])))
_, u, indices = np.unique(b, return_index=True, return_inverse=True)

あなたのaで、これは以下を与えます:

In [35]: u
Out[35]: array([0, 5, 7, 1, 6])

In [36]: indices
Out[36]: array([0, 3, 0, 3, 3, 1, 4, 2, 2, 4])

ただし、あなたが何になりたいかは、私には完全には明らかではありませんu。一意の列にしたい場合は、代わりに次を使用できます。

at = a.T
b = np.ascontiguousarray(at).view(np.dtype((np.void, at.dtype.itemsize * at.shape[1])))
_, idx, indices = np.unique(b, return_index=True, return_inverse=True)
u = a[:,idx]

これは

In [41]: u
Out[41]:
array([[0, 0, 1, 2, 2],
       [0, 1, 2, 1, 2]])

In [42]: indices
Out[42]: array([0, 3, 0, 3, 3, 1, 4, 2, 2, 4])
于 2013-08-12T22:35:59.320 に答える
1

あなたが何を求めているのか完全にはわかりませんが、numpy_indexedパッケージを見てください (免責事項: 私はその作者です)。この種の問題をより簡単にします。

import numpy_indexed as npi
unique_columns = npi.unique(A, axis=1)
# or perhaps this is what you want?
unique_columns, indices = npi.group_by(A.T, np.arange(A.shape[1])))
于 2016-04-02T14:40:24.290 に答える