Мне интересно, есть ли способ сгладить многомерный массив (т.е. типа ndarray
) вдоль заданных осей без копирования в NumPy. Например, у меня есть массив 2D-изображений, и я хочу сгладить каждый вектор. Таким образом, один простой способ сделать это - numpy.array([im.flatten() for im in images])
, но это создает копии каждого.
Как сгладить оси многомерного массива без копирования в NumPy?
Ответ 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
указывает изменить формулу для остальных размеров. Это предполагает, что вы
хотите сгладить первую ось изображений.