Как сгладить оси многомерного массива без копирования в NumPy?

Мне интересно, есть ли способ сгладить многомерный массив (т.е. типа ndarray) вдоль заданных осей без копирования в NumPy. Например, у меня есть массив 2D-изображений, и я хочу сгладить каждый вектор. Таким образом, один простой способ сделать это - numpy.array([im.flatten() for im in images]), но это создает копии каждого.

Ответ 1

ravel it:

>>> a = numpy.arange(25).reshape((5, 5))
>>> b = a.ravel()
>>> b[0] = 55
>>> a
array([[55,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

Или reshape it:

>>> a = numpy.arange(27).reshape((3, 3, 3))
>>> b = a.reshape((9, 3))
>>> b[0] = 55
>>> a
array([[[55, 55, 55],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

В большинстве случаев они возвращают представление исходного массива, а не копию.

Ответ 2

Если вы не знаете форму своего входного массива:

images.reshape((images.shape[0], -1))

-1 указывает изменить формулу для остальных размеров. Это предполагает, что вы хотите сгладить первую ось изображений.