Как я могу использовать уникальные ("строки") из MATLAB в Python? - PullRequest
9 голосов
/ 21 июля 2011

Я перевожу некоторые вещи из MATLAB на язык Python.

Эта команда уникальна (a) в NumPy . Но поскольку программа MATLAB также выполняет команду 'columns', она дает что-то немного другое.

Есть ли подобная команда в Python или я должен создать какой-нибудь алгоритм, который делает то же самое?

Ответы [ 2 ]

5 голосов
/ 21 июля 2011

Предполагается, что ваш 2D-массив хранится в обычном C-порядке (то есть каждая строка считается массивом или списком в основном массиве; другими словами, в мажорном порядке строки), или что вы предварительно транспонируете массив в противном случае , вы могли бы сделать что-то вроде ...

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [2, 3, 4], [1, 2, 3], [3, 4, 5]])
>>> a
array([[1, 2, 3],
       [2, 3, 4],
       [1, 2, 3],
       [3, 4, 5]])
>>> np.array([np.array(x) for x in set(tuple(x) for x in a)]) # or "list(x) for x in set[...]"
array([[3, 4, 5],
       [2, 3, 4],
       [1, 2, 3]])

Конечно, это не сработает, если вам нужны уникальные строки в их первоначальном порядке.

<ч />

Кстати, чтобы эмулировать что-то вроде unique(a, 'columns'), вы просто транспонировали исходный массив, делали шаг, показанный выше, а затем транспонировали обратно.

1 голос
/ 18 января 2013

Вы можете попробовать:

ii = 0; wrk_arr = your_arr
idx = numpy.arange(0,len(wrk_arr))
while ii<=len(wrk_arr)-1:
    i_list = numpy.arange(0,len(wrk_arr)
    candidate = numpy.matrix(wrk_arr[ii,:])
    i_dup = numpy.array([0] * len(wrk_arr))
    numpy.all(candidate == wrk_arr,axis=1, iout = idup)
    idup[ii]=0
    i_list = numpy.unique(i_list * (1-idup))
    idx = numpy.unique(idx * (1-idup))
    wrk_arr = wrk_arr[i_list,:]
    ii += 1

Результатом является wrk_arr, который является уникальным отсортированным массивом your_arr. Отношение:

your_arr[idx,:] = wrk_arr

Он работает как MATLAB в том смысле, что возвращаемый массив (wrk_arr) сохраняет порядок исходного массива (your_arr). Массив idx отличается от MATLAB, так как он содержит индексы первого появления, тогда как MATLAB возвращает LAST появление.

По моему опыту, он работал так же быстро, как MATLAB на матрице 10000 X 4.

И транспонирование сделает трюк для случая столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...