оптимизация работы 2D-1D в python - PullRequest
1 голос
/ 07 июня 2019

Что такое оптимизированный для Python-CPU способ применения простой операции, такой как умножение:

  • вдоль одного измерения двумерного массива
  • ко всем элементам другого измерения массива 2D
  • в соответствии с элементами другого 1D массива

пример:

x=np.arange(150).reshape([50,3])
y=np.arange(50)+10

Я хочу сделать:

np.array([x[i,:]*y[i] for i in range(50)])

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

кстати, это полностью эквивалентно:

np.array([x[i,:]*j for i,j in enumerate(y)])


Я сделал некоторые обновления здесь, но, наконец, открыл новые вопросы

Ответы [ 2 ]

4 голосов
/ 07 июня 2019

Вы можете просто добавить новую ось к y, используя None или np.newaxis, чтобы ее можно было транслировать по x:

x * y[:,None]

np.allclose((x * y[:,None]), np.array([x[i,:]*y[i] for i in range(50)]))
# True
1 голос
/ 07 июня 2019

Еще одна возможность, использовать швейцарский армейский нож из массива продуктов, то есть np.einsum

In [9]: x=np.arange(150).reshape([50,3])
   ...: y=np.arange(50)+10
   ...: check=np.array([x[i,:]*y[i] for i in range(50)])
   ...: np.allclose(np.einsum('ji,j->ji', x, y),check)
Out[9]: True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...