Моя проблема заключается в следующем:
import numpy as np
# given are two arrays of random, different shapes and sizes
a = np.array(...).reshape(?)
b = np.array(...).reshape(?)
# if broadcasting a and b works
c = a * b
# I want to guarantee that the assignment of the result works too
a += c
Это, очевидно, работает, если a.shape == (a * b).shape
, но не работает, если b
- больший массив.
Поэтому я хочу, чтобырезультат широковещания больше, чем a
, чтобы суммировать по широковещательным осям, используя некоторый оператор сокращения.
Пример ожидаемого вывода новой нужной мне функции broadcast_inverse ():
a = np.array(2)
b = np.ones(6).reshape(2, 3)
# broadcasting a to the shape of b
c = a * b
# now invert the broadcast by accumulating the excess axes
d = broadcast_inverse(c, a.shape, reduce_fun=np.sum)
assert a.shape == d.shape
print('a=', a) # a= 2
print('b=', b) # b= [[1 1 1] [1 1 1]]
print('c=', c) # c= [[2 2 2] [2 2 2]]
print('d=', d) # d= 12
Второй пример с использованием двумерных массивов и другой функции сокращения:
a = np.array([[2], [3]])
b = np.arange(2*3).reshape(2, 3) + 1
# broadcasting a to the shape of b
c = a * b
# broadcast inversion using the big product over the excess axes
d = broadcast_inverse(c, a.shape, reduce_fun=np.prod)
assert a.shape == d.shape
print('a=', a) # a= [[2] [3]]
print('b=', b) # b= [[1 2 3] [4 5 6]]
print('c=', c) # c= [[ 2 4 6] [12 15 18]]
print('d=', d) # d= [[ 48], [3240]]
Я пытался делать это, перебирая фигуры, но оказалось довольно сложно избавиться от ошибок.Так что я надеялся, что кто-то знает, разоблачает ли numpy, по каким осям он будет выполнять трансляцию, или, может быть, кто-нибудь знает какой-нибудь другой крутой эффективный трюк.Я на самом деле также был бы рад функции, которая не поддерживает скалярные массивы и различные функции сокращения.broadcast_inverse должен поддерживать только массивы больше 0D и функцию уменьшения суммы.