3

リストの numpy 配列が 2 つあるとします。

r = np.array([[1,2,3],[1,2,3],[4,5]])
q= np.array([[1,2,3],[1,2,3]])

numpy.uniqueそして、それらを一意のリストだけにトリミングするために使用します

np.unique(r)
array([[1, 2, 3], [4, 5]], dtype=object)
np.unique(q)
array([1, 2, 3])

np.unique(q)からの出力の深さが異なることがわかります。

私の質問は; 上記の両方の例で一貫した「深さ」を維持するにはどうすればよいですか?

つまり、次のようになりnp.unique(q)ます。

array([[1, 2, 3]], dtype=object)
4

1 に答える 1

1

これは、q構築方法に関係しています。あなたが言う時

q = np.array([[1,2,3],[1,2,3]])

6 つの項目の配列を作成しています。

In [77]: q.size
Out[77]: 6

この配列に適用np.uniqueすると、6 つの項目のそれぞれが個別の値と見なされ、一意の項目が返されます。

代わりに、qPython リストである 2 つのアイテムだけで を作成する場合:

In [78]: q = np.empty(2, dtype='object')

In [79]: q[:] = [[1,2,3],[1,2,3]]

In [80]: q.size
Out[80]: 2

次にnp.unique、目的の結果を返します。

In [81]: np.unique(q)
Out[81]: array([[1, 2, 3]], dtype=object)

別のものから始めると、違いはおそらくより明確になりますq

In [20]: q = np.array([[1,2,3],[1,2,4]])

In [21]: q2 = np.empty(2, dtype='object')

In [22]: q2[:] = [[1,2,3],[1,2,4]]

In [23]: q
Out[23]: 
array([[1, 2, 3],
       [1, 2, 4]])

In [24]: q2
Out[24]: array([[1, 2, 3], [1, 2, 4]], dtype=object)

これら 2 つの配列は似ていますが、動作が異なりますqq2

qint である 6 つの値を持つ形状 (2,3) の配列です。

q2Python リストである 2 つの値を持つ形状 (2,) の配列です。

に適用np.uniqueするとq、6 つの int の中で一意の値を見つけることになります。

に適用np.uniqueするとq2、2 つのリストの中で一意の値を見つけることになります。

In [25]: np.unique(q)
Out[25]: array([1, 2, 3, 4])

In [26]: np.unique(q2)
Out[26]: array([[1, 2, 3], [1, 2, 4]], dtype=object)

あなたの代替案は、実際にはnp.unique(q)2次元にするだけです。

In [27]: np.array([np.unique(q).tolist()],dtype='object')
Out[27]: array([[1, 2, 3, 4]], dtype=object)

それがあなたのやりたいことなら、代わりに以下を使うことができますnp.atleast_2d:

In [28]: np.atleast_2d(np.unique(q))
Out[28]: array([[1, 2, 3, 4]])

結果を出したい場合

array([[1, 2, 3], [1, 2, 4]], dtype=object)

次にq、 dtype の 2 要素配列として構築する必要がありますobject。で初期化する

q = np.empty(2, dtype='object')

これを達成する方法を私が知っている最も簡単な方法です。


また、 dtype の NumPy 配列を扱っていることに気付いobjectた場合は、プレーンな Python オブジェクトを使用する方がよいのではないか自問してください。

In [32]: set(map(tuple, ([[1, 2, 3], [1, 2, 4]])))
Out[32]: {(1, 2, 3), (1, 2, 4)}

In [33]: %timeit set(map(tuple, ([[1, 2, 3], [1, 2, 4]])))
1000000 loops, best of 3: 1.07 µs per loop

In [34]: %timeit np.unique(q2)
100000 loops, best of 3: 13.1 µs per loop
于 2013-10-04T12:07:29.373 に答える