Умножить массив (k,) или (k, n) на 1D массив (k,) - PullRequest
0 голосов
/ 04 сентября 2018

Я иногда работаю с 1D массивами:

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

или двумерные массивы (монофонические или стереофонические сигналы считываются с scipy.io.wavfile):

A = np.array([[1, 2], [3, 4], [5, 6], [7,8]])

Без необходимости различать эти 2 случая с if A.ndim == 2: ..., существует ли простое однострочное решение для умножения этого массива A на одномерный массив B = np.linspace(0., 1., 4)?

Если A - это 1D, то это просто A * B, а если A - это 2D, я имею в виду умножение каждой строки A на каждый элемент B.


Примечание: этот вопрос возникает естественным образом при работе с монофоническими и стереофоническими звуками, считанными с scipy.io.wavfile.

1 Ответ

0 голосов
/ 04 сентября 2018

Подход № 1

Мы можем использовать einsum для покрытия общих ndarrays -

np.einsum('i...,i->i...',A,B)

Трюк, который работает здесь, это ellipsis, который транслирует для конечных измерений после первой оси, когда они находятся в A, и сохраняет их на выходе, сохраняя при этом первые оси для двух входов выровненными, что предполагаемое умножение здесь. С A в качестве массива 1D вещание отсутствует, и это существенно сокращается до: np.einsum('i,i->i',A,B) под капотами.

Схематически обозначено:

A   :  i x ....
B   :  i 
out :  i x ....

Следовательно, крышки для A с любым количеством измерений.

Подробнее об использовании ellipsis из документации:

Чтобы включить и контролировать вещание, используйте многоточие. По умолчанию Вещание в стиле NumPy осуществляется путем добавления многоточия слева от каждый термин, например, np.einsum ('... ii -> ... i', a). Взять след По первой и последней осям вы можете выполнить np.einsum ('i ... i', a) или сделать матрично-матричное произведение с крайними левыми индексами вместо крайних правых, Вы можете сделать np.einsum ('ij ..., jk ...-> ik ...', a, b).

Подход № 2

Используя тот факт, что мы пытаемся выровнять первую ось A с единственной осью массива 1D B, мы можем просто транспонировать A, умножить на B и, наконец, транспонировать обратно -

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