В большой базе кода, я использую np.broadcast_to
транслировать массивы (только с помощью простых примеров здесь):Un-вещание Numpy массивы
In [1]: x = np.array([1,2,3])
In [2]: y = np.broadcast_to(x, (2,1,3))
In [3]: y.shape
Out[3]: (2, 1, 3)
В другом месте в коде, я использую сторонние функции, которые могут работать в векторном виде на массивах Numpy, но это не ufuncs. Эти функции не понимают вещание, а это означает, что вызов такой функции на массивах, как y
, неэффективен. Такие решения, как Numpy's vectorize
, не очень хороши либо потому, что, пока они понимают вещание, они вводят цикл for
над элементами массива, который тогда очень неэффективен.
В идеале, что бы я хотел сделать, это иметь функцию, которую мы можем назвать, например. unbroadcast
, который возвращает массив с минимальной формой, который может быть передан обратно в полный размер, если это необходимо. Так например .:
In [4]: z = unbroadcast(y)
In [5]: z.shape
Out[5]: (1, 1, 3)
Затем я могу запустить функции сторонних на z
, а затем транслировать результат обратно в y.shape
.
Есть ли способ реализовать unbroadcast
, который опирается на публичный API Numpy? Если нет, есть ли какие-либо хаки, которые приведут к желаемому результату?
Что-то вроде 'y [None, 0]'? – Divakar
Что значит «минимальная форма»? Не будет ли минимальная форма в измерениях N, возвращаемая 'unbroadcast', всегда быть' (1, 1, ..., 1) '(или даже' (1,) ')? –
Я имею в виду минимальную форму, которая все еще содержит все необходимые данные, чтобы передать ее обратно в полный массив. Итак, в приведенном выше примере '' z.shape'' '' (1,1,3) '' not '' (1,1,1) ''. – astrofrog