Numpy добавить с несколькими массивами - PullRequest
0 голосов
/ 25 сентября 2019

Есть ли способ добавить (в отличие от суммы) нескольких массивов вместе в одной операции?Очевидно, что np.sum и np.add - это разные операции, однако проблема, с которой я сейчас борюсь, состоит в том, что np.add принимает только два массива одновременно.Я мог бы использовать либо

output = 0
for arr in arr_list:
    output = output + array

, либо

output = 0
for arr in arr_list:
    output = np.add(output, array)

, и, да, это выполнимо.Тем не менее, было бы неплохо, если бы я мог просто сделать какой-нибудь вариант

output = np.add_multiple(arr_list)

Существует ли это?В частности, мне нужна функция, которая не требует построения массива массивов, так как мои массивы не имеют равных размеров и требуют широковещательной передачи, например:

a = np.arange(3).reshape(1,3)
b = np.arange(9).reshape(3,3)

a, b = a[:,:,None,None], b[None,None,:,:]

Эти работы:

a + b        # Works
np.add(a, b) # Works

Они делают не и терпят неудачу с тем же исключением:

np.sum([a, b], axis = 0)
np.add.reduce([a, b])

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (3,1,1) into shape (1)

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Вы можете просто использовать встроенную в Python sum:

output = sum(arr_list)

Для многих других numpy функций можно использовать np.<ufunc>.reduce, как показано @hpaulj.

1 голос
/ 25 сентября 2019

Вы можете использовать sum() для добавления нескольких массивов.

arr = np.array([[6,2,3,5,4,3], 
          [7,7,2,4,6,7],
          [10,6,2,4,5,9]])
np.add(0, arr.sum(axis=0))
1 голос
/ 25 сентября 2019
In [18]: alist = [np.arange(4),np.ones(4),np.array([10,1,11,2])]                
In [19]: np.add.reduce(alist)                                                   
Out[19]: array([11.,  3., 14.,  6.])
In [20]: alist[0]+alist[1]+alist[2]                                             
Out[20]: array([11.,  3., 14.,  6.])

И для большего удовольствия:

In [21]: np.add.accumulate(alist)                                               
Out[21]: 
array([[ 0.,  1.,  2.,  3.],
       [ 1.,  2.,  3.,  4.],
       [11.,  3., 14.,  6.]])

edit


In [53]: a.shape                                                                
Out[53]: (1, 1, 1, 3)
In [54]: b.shape                                                                
Out[54]: (3, 3, 1, 1)

Дополнение с трансляцией:

In [63]: sum([a,b]).shape                                                       
Out[63]: (3, 3, 1, 3)
In [64]: (a+b).shape                                                            
Out[64]: (3, 3, 1, 3)
In [66]: np.add.reduce([a,b]).shape                                             
Out[66]: (3, 3, 1, 3)

Для чего это стоитЯ предлагал add.reduce, потому что я думал, что вы хотите добавить более двух массивов.

Все это работает, пока массивы передаются вместе.

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