Как сгладить только некоторые измерения массива numpy

129

Есть ли быстрый способ «сгладить» или сгладить только некоторые из первых измерений в массиве numpy?

Например, для большого массива измерений (50,100,25)результирующие измерения будут(5000,25)

любознательный
источник
1
Это может помочь stackoverflow.com/questions/13990465/3d-numpy-array-to-2d
Анкур Анкан
Вам нужен курс повышения квалификации по нарезке массива numpy ndarray. Также известно как многомерные индексации массива, см: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html срез массива ваш ndarray с помощью квадратных скобок, и использовать запятую для разделения , сколько каждого размер, который вы хотите. Это будет выглядеть примерно так (не совсем так): your_array[50:100, 7, :]который сглаживает трехмерный объект до 2d, используя только срез номер 7 для 2-го измерения.
Эрик Лещинский

Ответы:

129

Взгляните на numpy.reshape .

>>> arr = numpy.zeros((50,100,25))
>>> arr.shape
# (50, 100, 25)

>>> new_arr = arr.reshape(5000,25)
>>> new_arr.shape   
# (5000, 25)

# One shape dimension can be -1. 
# In this case, the value is inferred from 
# the length of the array and remaining dimensions.
>>> another_arr = arr.reshape(-1, arr.shape[-1])
>>> another_arr.shape
# (5000, 25)
Александр
источник
Такие решения кажутся мне немного неэлегантными, поскольку они требуют некоторой избыточной информации. Хотелось бы, чтобы был способ сделать это, для чего требовалось только указать подмножество измерений, что-то вроде arr.flatten(dimensions=(0, 1)).
Denziloe
82

Небольшое обобщение ответа Александра - np.reshape может принимать в качестве аргумента -1, что означает «общий размер массива, деленный на произведение всех других перечисленных измерений»:

например, чтобы сгладить все, кроме последнего измерения:

>>> arr = numpy.zeros((50,100,25))
>>> new_arr = arr.reshape(-1, arr.shape[-1])
>>> new_arr.shape
# (5000, 25)
Питер
источник
33

Небольшое обобщение ответа Питера - вы можете указать диапазон исходной формы массива, если хотите выйти за пределы трехмерных массивов.

например, чтобы сгладить все измерения, кроме двух последних :

arr = numpy.zeros((3, 4, 5, 6))
new_arr = arr.reshape(-1, *arr.shape[-2:])
new_arr.shape
# (12, 5, 6)

РЕДАКТИРОВАТЬ: небольшое обобщение моего более раннего ответа - вы, конечно, также можете указать диапазон в начале изменения формы:

arr = numpy.zeros((3, 4, 5, 6, 7, 8))
new_arr = arr.reshape(*arr.shape[:2], -1, *arr.shape[-2:])
new_arr.shape
# (3, 4, 30, 7, 8)
KeithWM
источник
2
Прошло уже больше двух лет ... Нам нужно еще одно небольшое обобщение! ;)
Лит
1

Альтернативный подход - использовать, numpy.resize()как в:

In [37]: shp = (50,100,25)
In [38]: arr = np.random.random_sample(shp)
In [45]: resized_arr = np.resize(arr, (np.prod(shp[:2]), shp[-1]))
In [46]: resized_arr.shape
Out[46]: (5000, 25)

# sanity check with other solutions
In [47]: resized = np.reshape(arr, (-1, shp[-1]))
In [48]: np.allclose(resized_arr, resized)
Out[48]: True
kmario23
источник