Numpy Unique 2D Sub-array
I have 3D numpy array and I want only unique 2D-sub-arrays. Input: [[[ 1 2] [ 3 4]] [[ 5 6] [ 7 8]] [[ 9 10] [11 12]] [[ 5 6] [ 7 8]]] Output: [[[ 1 2] [ 3
Solution 1:
Using @Jaime's post
, to solve our case of finding unique 2D subarrays, I came up with this solution that basically adds a reshaping to the view
step -
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]]
Sample run -
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]]])
Solution 2:
The numpy_indexed package (disclaimer: I am its author) is designed to do operations such as these in an efficient and vectorized manner:
import numpy_indexed as npi
npi.unique(a)
Solution 3:
One solution would be to use a set to keep track of which sub arrays you have seen:
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)
Or using numpy only:
print np.unique(a).reshape((len(unique) / 4, 2, 2))
>>> [[[ 1 2]
[ 3 4]]
[[ 5 6]
[ 7 8]]
[[ 9 10]
[11 12]]]
Post a Comment for "Numpy Unique 2D Sub-array"