Как бы я изменил содержимое массива, используя другой массив? - PullRequest
0 голосов
/ 03 ноября 2018

Во-первых, я знаю, что есть довольно простой способ сделать это, используя цикл for, но это вычисление, которое нужно делать много раз каждую секунду, а циклы for в python слишком неэффективны. сделать это. Поэтому я ищу что-то в numpy, которое могло бы это исправить.

У меня есть двумерный массив (arr1) со значениями от 0 до 256 и одномерный массив (arr2), имеющий размер 256 и содержащий информацию о том, как часто число в этом двумерном массиве присутствует. Например, если arr1 [0, 0] = 1 и arr1 [0, 1] = 1, и они единственные, которые имеют значение 1, то arr2 [1] = 2, потому что значение 1 существует дважды в arr1.

То, что я хочу сделать сейчас, это сопоставить этот номер частоты с arr1, так как в предыдущем примере arr1 [0,0] и arr1 [0,1] оба стали бы 2, потому что это частота их предыдущего значения .

Короче, это будет выглядеть примерно так, но, очевидно, это не может работать вне цикла for:

arr1[i,j] = arr2[arr1[i,j]]

Существует ли простой, быстрый и эффективный способ сделать это с помощью numpy?

1 Ответ

0 голосов
/ 03 ноября 2018

Учитывая, что arr2 является одномерным массивом, вы можете написать это как:

arr1 = arr2[arr1]

Здесь мы, таким образом, делаем поэлементное «отображение», где новое arr1[i, j] - это значение, которое соответствует значению индекса в arr2, сохраненному для старого значения arr1[i, j].

Например:

>>> a
array([[ 3, 15,  3, 15,  5],
       [ 8, 17, 14, 10,  1],
       [ 3,  8,  9,  0,  1],
       [10,  3, 10,  9,  1]])
>>> b
array([17, 16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,
        0])
>>> b[a]
array([[14,  2, 14,  2, 12],
       [ 9,  0,  3,  7, 16],
       [14,  9,  8, 17, 16],
       [ 7, 14,  7,  8, 16]])

Здесь для индекса i, b[i] = 17 - i мы видим, что это отображение выполняется при вычислении b[a].

В случае, если arr1 содержит значение, которое не является допустимым индексом, это, однако, логически приведет к IndexError.

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