我有3D numpy数组,我只想要独特的2D子数组。
输入:
[[[ 1 2]
[ 3 4]]
[[ 5 6]
[ 7 8]]
[[ 9 10]
[11 12]]
[[ 5 6]
[ 7 8]]]
输出:
[[[ 1 2]
[ 3 4]]
[[ 5 6]
[ 7 8]]
[[ 9 10]
[11 12]]]
我尝试将子数组转换为字符串(tostring()方法),然后使用np.unique,但在转换为numpy数组后,它删除了\ x00的最后一个字节,所以我无法用np将其转换回来。 fromstring()。
示例:
import numpy as np
a = np.array([[[1,2],[3,4]],[[5,6],[7,8]],[[9,10],[11,12]],[[5,6],[7,8]]])
b = [x.tostring() for x in a]
print(b)
c = np.array(b)
print(c)
print(np.array([np.fromstring(x) for x in c]))
输出:
[b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00', b'\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00', b'\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00', b'\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00']
[b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04'
b'\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08'
b'\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x0c'
b'\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08']
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-86-6772b096689f> in <module>()
5 c = np.array(b)
6 print(c)
----> 7 print(np.array([np.fromstring(x) for x in c]))
<ipython-input-86-6772b096689f> in <listcomp>(.0)
5 c = np.array(b)
6 print(c)
----> 7 print(np.array([np.fromstring(x) for x in c]))
ValueError: string size must be a multiple of element size
我也试过了,但我真的不知道如何使用它。 你能帮帮我吗?
答案 0 :(得分:4)
使用@Jaime's post
来解决我们找到独特2D子阵列的情况,我提出了这个解决方案,它基本上为view
步骤添加了一个重塑 -
def unique2D_subarray(a):
dtype1 = np.dtype((np.void, a.dtype.itemsize * np.prod(a.shape[1:])))
b = np.ascontiguousarray(a.reshape(a.shape[0],-1)).view(dtype1)
return a[np.unique(b, return_index=1)[1]]
示例运行 -
In [62]: a
Out[62]:
array([[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9, 10],
[11, 12]],
[[ 5, 6],
[ 7, 8]]])
In [63]: unique2D_subarray(a)
Out[63]:
array([[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9, 10],
[11, 12]]])
答案 1 :(得分:2)
numpy_indexed包(免责声明:我是它的作者)旨在以高效和矢量化的方式执行这些操作:
import numpy_indexed as npi
npi.unique(a)
答案 2 :(得分:1)
一种解决方案是使用一个集来跟踪您看到的子阵列:
seen = set([])
new_a = []
for j in a:
f = tuple(list(j.flatten()))
if f not in seen:
new_a.append(j)
seen.add(f)
print np.array(new_a)
或仅使用numpy:
print np.unique(a).reshape((len(unique) / 4, 2, 2))
>>> [[[ 1 2]
[ 3 4]]
[[ 5 6]
[ 7 8]]
[[ 9 10]
[11 12]]]