Сохранять порядок при получении уникальных строк в массиве NumPy - PullRequest
0 голосов
/ 11 января 2019

У меня есть три двумерных массива a1, a2 и a3

In [165]: a1
Out[165]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

In [166]: a2
Out[166]: 
array([[ 9, 10, 11],
       [15, 16, 17],
       [18, 19, 20]])

In [167]: a3 
Out[167]: 
array([[6, 7, 8],
       [4, 5, 5]])

И я собрал эти массивы в один массив:

In [168]: stacked = np.vstack((a1, a2, a3))

In [170]: stacked 
Out[170]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [ 9, 10, 11],
       [15, 16, 17],
       [18, 19, 20],
       [ 6,  7,  8],
       [ 4,  5,  5]])

Теперь я хочу избавиться от повторяющихся строк. Итак, numpy.unique делает свою работу.

In [169]: np.unique(stacked, axis=0)
Out[169]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 4,  5,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [15, 16, 17],
       [18, 19, 20]])

Однако здесь есть одна проблема. Исходный порядок теряется при взятии уникальных строк. Как я могу сохранить исходный порядок и при этом взять уникальные строки?

Итак, ожидаемый результат должен быть:

array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [15, 16, 17],
       [18, 19, 20],
       [ 4,  5,  5]])

Ответы [ 2 ]

0 голосов
/ 11 января 2019

после получения сложенного массива

шаг 1: получить индексы строк для отсортированного уникального массива

row_indexes = np.unique(stacked, return_index=True, axis=0)[1]

Примечание: row_indexes содержит индексы для отсортированного массива

шаг 2: теперь перебираем составной массив с отсортированным индексом

sorted_index=sorted(row_indexes)
new_arr=[]
for i in range(len(sorted_index)):
    new_arr.append(stacked[sorted_index[i]]

Вот и все !!!!!

0 голосов
/ 11 января 2019

Использование return_index

_,idx=np.unique(stacked, axis=0,return_index=True)

stacked[np.sort(idx)]
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [15, 16, 17],
       [18, 19, 20],
       [ 4,  5,  5]])
...