Як вирівняти лише деякі розміри масивного ряду


128

Чи є швидкий спосіб "згладити" або вирівняти лише деякі перші розміри в масивному масиві?

Наприклад, з урахуванням нумерованого масиву розмірів (50,100,25)отримані розміри будуть(5000,25)



Вам потрібен курс підвищення кваліфікації по нумерованому масиву ndarray. Також відомий як індексація багатовимірного масиву, див.: Docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html Масив розрізає ndarray за допомогою квадратних дужок, а за допомогою роздільника знаків комах розділити, скільки кожного з них потрібний розмір. Це буде виглядати приблизно так (не зовсім так), your_array[50:100, 7, :]що згладжує 3d-об’єкт до 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)

81

Невелике узагальнення відповіді Олександра - 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)

EDIT: Невелике узагальнення моєї попередньої відповіді - ви, звичайно, також можете вказати діапазон на початку зміни форми:

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)

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.