Создать 3D тензор из вектора - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть вектор

In [26]: x                                                                      
Out[26]: array([1, 2])

И у меня есть 3D-тензор a с формой (10,2,30), его содержимое равно True,False. Я должен умножить каждый a[i,:,:] на x[i]. Я думал, что numpy.tile, но это не работает.

Есть способ сделать это, избегая циклов for?

1 Ответ

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

Редактировать: Улучшенное решение, первое решение использовало некоторую ненужную транспонирование.

Для операций такого типа np.tensordot и np.einsum могут быть вашими друзьями. К ним может быть трудно привыкнуть, поэтому я сделал это следующим образом: (обратите внимание, что для транспонирования и изменения формы массивов в numpy это очень быстро, требуется только изменение шагов массив, поэтому время, которое требуется, не увеличивается с размером вашего набора данных, вы можете прочитать об этом здесь .

a = np.array([0,10])
b = np.arange(600).reshape(10,2,30)

#making a same dimention as b
a = a.reshape((1,2,1))
c = a*b

Мы хотим умножить a и b вдоль некоторой оси поэтому мы изменяем форму, чтобы массивы совпадали по этой оси, а затем умножаем их.

Скорее всего, существует более элегантный способ сделать это, но он работает и довольно быстрый (0,004 с, если имеет длину 20 и b имеет форму (100, 20, 300).

...