Суммируйте каждую строку массива numpy со всеми строками второго массива numpy (python) - PullRequest
0 голосов
/ 29 января 2019

Я хотел бы знать, есть ли какой-нибудь быстрый способ суммировать каждую строку первого массива со всеми строками второго массива.В этом случае оба массива имеют одинаковое количество столбцов.Например, если array1.shape = (n,c) и array2.shape = (m,c), результирующий массив будет иметь вид array3.shape = ((n*m), c)

. Посмотрите на приведенный ниже пример:

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

array2 = np.array([[0, 1, 2],
                   [3, 4, 5]])

Результат будет:

array3 = np.array([[0,  2,  4],
                   [3,  5,  7]
                   [3,  5,  7]
                   [9,  8, 10]
                   [6,  8, 10]
                   [9, 11, 13]])

Единственный способ, которым я вижу, что я могу сделать это, состоит в том, чтобы повторять каждую строку одного из массивов количеством строк другого массива.Например, выполнив np.repeat(array1, len(array2), axis=0), а затем сложите этот массив с array2.Однако это не очень практично, если количество строк слишком велико.Другой способ - использовать цикл for, но он слишком медленный.

Любой другой лучший способ сделать это ..?

Заранее спасибо.

Ответы [ 2 ]

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

Расширьте array1 до 3D, чтобы оно стало транслируемым по отношению к 2D array2, а затем выполните добавленное вещание, и для желаемого результата потребуется окончательное изменение формы -

In [30]: (array1[:,None,:] + array2).reshape(-1,array1.shape[1])
Out[30]: 
array([[ 0,  2,  4],
       [ 3,  5,  7],
       [ 3,  5,  7],
       [ 6,  8, 10],
       [ 6,  8, 10],
       [ 9, 11, 13]])
0 голосов
/ 29 января 2019

Вы можете попробовать следующий встроенный код, если вы этого еще не сделали.Это самый простой и, вероятно, самый быстрый способ в одном потоке.

>>> import numpy as np
>>> array1 = np.array([[0, 1, 2],
...                    [3, 4, 5],
...                    [6, 7, 8]])
>>> 
>>> array2 = np.array([[0, 1, 2],
...                    [3, 4, 5]])
>>> array3 = np.array([i+j for i in array1 for j in array2])
>>> array3
array([[ 0,  2,  4],
       [ 3,  5,  7],
       [ 3,  5,  7],
       [ 6,  8, 10],
       [ 6,  8, 10],
       [ 9, 11, 13]])
>>> 

Если вы ищете ускорение при шаге, вы можете использовать CUDA или многопоточность .Это предложение немного выходит за рамки вашего вопроса, но дает вам представление о том, что можно сделать для ускорения матричных операций.

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