Каков наилучший способ сделать это?Python/Numpy - Matrix Умножить двумерный массив и каждую строку другого двумерного массива
a = 3x3 array
b = 20x3 array
c = 20x3 array = some_dot_function(a, b) where:
c[0] = np.dot(a, b[0])
c[1] = np.dot(a, b[1])
c[2] = np.dot(a, b[2])
...etc...
Я знаю, что это можно сделать с помощью простого цикла питона или с помощью apply_along_axis Numpy, но мне интересно, если есть хороший способ сделать это полностью в пределах базового кода C в NumPy. Я смотрел на тендердот и некоторые другие функции, но не повезло. Я также попытался следующие:
c = np.dot(a, b[:, :, np.newaxis]
#c.shape = (3, 59, 1)
Это на самом деле бежал и дал результаты, которые выглядели примерно правильно, за исключением того, что полученный массив не 20x3. Я могу найти способ изменить его в массив, который я хочу, но я подумал, что должен быть более простой/более чистый/понятный встроенный метод, который мне не хватает?
Я видел этот метод, но я не могу показаться, чтобы обернуть вокруг головы, как это работает. Это кажется очень сильным, и я просто трачу некоторое время на чтение. Даже в документации говорится, что лучший способ понять это с примерами. Может быть, мне нужно больше поиграть с ним, но я не понимаю с места битвы, как здесь работают суммы. –
@ScottB, подумайте о строке, указав форму, которую примет оператор присваивания, если вы пишете его на чистом питоне, используя серию вложенных циклов. 'i' - это самый внешний индекс,' j', следующий и т. д., а формат - '{индексы}, {b индексы} -> {выходные индексы}'. Другими словами, 'output [i, j] + = a [i, j] * b [j, k]' становится 'ij, jk-> ij''. Посмотрите, как это работает? ИМО, используя 'dot' и' T', здесь более разборчиво, но для необычных суммирования 'einsum' - это абсолютно путь. – senderle
@ScottB Я добавил несколько строк после d2 = ...чтобы объяснить немного больше, что вы делаете с этими индексами, на самом деле это довольно просто, как только вы обнимаете его (просто напишите, как в четверке для цикла, например d1 [i, j] = ..., а затем напишите, что вы делаете с индексами, но в одной строке, как и в d2 = ... – usethedeathstar