Как бы вы эффективно переставили этот массив? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть массив arr_val, который хранит значения определенной функции при большом размере местоположений (для иллюстрации давайте просто возьмем маленькое 4 местоположения). Теперь предположим, что у меня также есть еще один массив loc_array, в котором хранится местоположение функции, и предположим, что местоположение снова совпадает с номером 4. Однако массив расположений является многомерным массивом, так что каждый индекс местоположения имеет одинаковые 4 индекс местоположения, и каждый индекс подобласти является парой координат. Чтобы наглядно проиллюстрировать:

arr_val = np.array([1, 2, 3, 4])
loc_array = np.array([[[1,1],[2,3],[3,1],[3,2]],[[1,2],[2,4],[3,4],[4,1]], 
                     [[2,1],[1,4],[1,3],[3,3]],[[4,2],[4,3],[2,2],[4,4]]])

Значение двух вышеупомянутых массивов будет значением некоторого интересующего параметра, например, местоположения [1,1],[2,3],[3,1],[3,2] равны 1 и т. Д. Тем не менее, я заинтересован в том, чтобы повторно выразить то же самое выше в другой форме, которая вместо случайных точек, я хотел бы иметь координаты в следующей поддающейся обработке форме

coord = [[[1,1],[1,2],[1,3],[1,4]],[[2,1],[2,2],[2,3],[2,4]],[[3,1],[3,2], 
          [3,3],[3,4]],[[4,1],[4,2],[4,3],[4,4]]]

и значения в соответствующих координатах, заданные как

val = [[1, 2, 3, 3],[3, 4, 1, 2],[1, 1, 3, 2], [2, 4, 4, 4]]

Что может быть очень эффективным способом для достижения вышесказанного для больших массивов numpy?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы можете использовать lexsort примерно так:

>>> order = np.lexsort(loc_array.reshape(-1, 2).T[::-1])
>>> arr_val.repeat(4)[order].reshape(4, 4)
array([[1, 2, 3, 3],
       [3, 4, 1, 2],
       [1, 1, 3, 2],
       [2, 4, 4, 4]])

Если вы точно знаете, что loc_array является перестановкой всех возможных местоположений, тогда вы можете избежать сортировки:

>>> out = np.empty((4, 4), arr_val.dtype)
>>> out.ravel()[np.ravel_multi_index((loc_array-1).reshape(-1, 2).T, (4, 4))] = arr_val.repeat(4)
>>> out
array([[1, 2, 3, 3],
       [3, 4, 1, 2],
       [1, 1, 3, 2],
       [2, 4, 4, 4]])
0 голосов
/ 11 мая 2018

Это не может быть ответ, что вы хотите, но все равно работает.

val = [[1, 2, 3, 3],[3, 4, 1, 2],[1, 1, 3, 2], [2, 4, 4, 4]]
temp= ""
int_list = []

for element in val:
    temp_int = temp.join(map(str, element ))
    int_list.append(int(temp_int))

int_list.sort()
print(int_list)

## result ##
[1132, 1233, 2444, 3412]
  • Измените каждый element array на int и создайте int_list
  • Сортировка int_list
  • Построить 2D np.array из int_list

Я пропустил последние части. Вы можете найти путь в Интернете.

...