Как реализовать механизм транскрипции с помощью mkl? - PullRequest
0 голосов
/ 04 января 2019

Как реализовать механизм широковещательной трансляции с помощью mkl?

Я был сбит с толку, как использовать mkl для эффективной реализации механизма широковещания в numpy (Элементный оператор "+", "-", "*")?

такой как 2-D массив sub 1-D массив

[[1,2,3],              [[0,0,0],
 [4,5,6],  - [1,2,3] =  [3,3,3],
 [7,8,9]]               [6,6,6]] 

И вторая операция (можно понимать как матрицу, умноженную на диагональную матрицу) 2-D массив умножения 1-D массив (умножение элемента)

[[1,2,3],               [[1,4,9],
 [4,5,6],  *  [1,2,3] =  [4,10,18],
 [7,8,9]]                [7,16,27]] 

Я попытался реализовать с помощью цикла for + cblas_dscal / vdSub. Но я думаю, что это неэффективно, я не знаю, есть ли лучшая реализация.

1 Ответ

0 голосов
/ 04 января 2019

Вы можете просто передать второй массив в два измерения с помощью arr2[None, :]. Это дает следующий код:

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

print(arr1 - arr2[None, :])
# Out: [[0 0 0]
#       [3 3 3]
#       [6 6 6]]
print(arr1 * arr2[None, :])
# Out: [[ 1,  4,  9],
#       [ 4, 10, 18],
#       [ 7, 16, 27]]

Если вы транслируете свои массивы таким образом, numpy будет использовать оптимизации, такие как mkl, для выполнения запрошенных операций, таких как умножения.
Дополнительную информацию о трансляции и расширении размеров массива с помощью None или np.newaxis можно найти здесь:

...