2013-09-12 6 views
53

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

Например, учитывая NumPy массив размеров (50,100,25), размеры результирующие будет (5000,25)

+1

Это может помочь http://stackoverflow.com/questions/13990465/3d-numpy-array-to-2d –

+0

Вам нужен повторный курс на Numpy ndarray нарезка массива. Также известна как многомерная индексация массивов, см. Https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html Массив разрезает ваш ndarray, используя квадратные скобки, и используйте разделитель запятой для разделения сколько каждого размера вы хотите. Он будет выглядеть примерно так (не точно): 'your_array [50: 100, 7,:]', который выравнивает 3d-объект до 2d, используя только срез номер 7 для второго измерения. –

ответ

57

Посмотрите на 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) 
57

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

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

>>> arr = numpy.zeros((50,100,25)) 
>>> new_arr = arr.reshape(-1, arr.shape[-1]) 
>>> new_arr.shape 
# (5000, 25) 
3

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

например. выравниваться все, но последние два размеров:

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

EDIT: небольшое обобщение моего предыдущего ответа - вы можете, конечно, также указать диапазон в начале из RESHAPE тоже:

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) 
Смежные вопросы