Нужна какая-то обратная сводная операция - PullRequest
0 голосов
/ 20 февраля 2019

Моя проблема заключается в следующем:

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 и функцию уменьшения суммы.

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