これは、q
構築方法に関係しています。あなたが言う時
q = np.array([[1,2,3],[1,2,3]])
6 つの項目の配列を作成しています。
In [77]: q.size
Out[77]: 6
この配列に適用np.unique
すると、6 つの項目のそれぞれが個別の値と見なされ、一意の項目が返されます。
代わりに、q
Python リストである 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 つの配列は似ていますが、動作が異なりますq
。q2
q
int である 6 つの値を持つ形状 (2,3) の配列です。
q2
Python リストである 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