Как получить "2d индексы" 2d ndarray, упорядоченные по значению элементов - PullRequest
1 голос
/ 20 апреля 2020

У меня есть 2d ndarray of ndarrays, который выглядит следующим образом:

array([[array([0]), array([0, 1]), array([0, 1]), None, None,array([0, 1])],
       [array([0, 1]), None, array([0, 1]), array([0, 1]), array([0, 1]),None],
       [None, None, array([0, 1]), None, None, None],
       [array([0, 1]), array([0, 1]), None, array([0, 1]), array([0, 1]),array([0, 1])],
       [array([0, 1]), None, None, None, array([0, 1]), None],
       [array([0, 1]), None, array([0, 1]), array([0, 1]), array([0, 1]),None]], dtype=object)

Моя цель состоит в том, чтобы получить индексы элементов, отсортированные по len(element), также пропускает те элементы, которые None. Как:

array([[0,0], --> len= 1
       [0,1], --> len=2
       [0,2], --> len=2
       [0,5],  ...
       [1,0],
       [1,2],
       [1,3],
       [1,4], 
       ...   ])

Я попытался сначала преобразовать элементы в их len, что даст нам что-то вроде:

array([[1, 2, 2, 0, 0, 2],
       [2, 0, 2, 2, 2, 0],
       [0, 0, 2, 0, 0, 0],
       [2, 2, 0, 2, 2, 2],
       [2, 0, 0, 0, 2, 0],
       [2, 0, 2, 2, 2, 0]], dtype=object)

Однако я не смог найти эффективный способ создания списка индексов (или ndarray будет делать).

Пожалуйста, помогите мне с этим. Я ценю любого, кто мог бы решить эту проблему или дать мне некоторую подсказку.

Редактировать: Я нашел близкое, но не идеальное решение: из-за ограничений данных элементы "lenArray" могут иметь только 3 вида значения: 1, 2, инф. Поэтому я могу воспользоваться этим, чтобы сделать:

ones = np.column_stack(np.where(lenArray==1))
twos = np.column_stack(np.where(lenArray==2))
infs = np.column_stack(np.where(lenArray==inf))
sort_lenidx = np.concatenate((ones,twos,infs))

Где sort_lenidx будет соответствовать моим потребностям. Однако это не очень общий (если возможные значения nums будут очень большими, это будет бесполезно) и элегантный способ решения моей проблемы. Я все еще надеюсь, что кто-то может дать мне лучший способ сделать это. Буду признателен за вашу помощь в любой форме.

1 Ответ

0 голосов
/ 20 апреля 2020

Давайте назовем массив, содержащий длины lenArray.

Правильный способ сделать это будет путем создания другого 2d массива - rowNcol, который содержит индексы строк и столбцов lenArray в качестве элементов. Затем реализуйте алгоритм сортировки на lenArray и выполните идентичные операции на rowNcol, чтобы, наконец, получить желаемый массив индексов.

При этом вы могли бы использовать тот факт, что мы заранее знать тип (int) и диапазон элементов внутри lenArray и просто перебирать возможные элементы следующим образом:

from numpy import array, amax


lenArray = array([[1, 2, 2, 0, 0, 2],
                  [2, 0, 2, 2, 2, 0],
                  [0, 0, 2, 0, 0, 0],
                  [2, 2, 0, 2, 2, 2],
                  [2, 0, 0, 0, 2, 0],
                  [2, 0, 2, 2, 2, 0]])

rows, cols = lenArray.shape
lenMax = amax(lenArray)

for lenVal in range(lenMax):
    for i in range(rows):
        for j in range(cols):
            if (lenArray[i,j] == lenVal):
                print(str(i) + ',' + str(j))


Это, однако, крайне неэффективно, если размер lenArray очень большой, так как вы анализируете его снова и снова.

Редактировать: Позже я столкнулся с numpy .argsort , который, кажется, делает именно то, что вы хотите.

...