Cách làm phẳng chỉ một số kích thước của mảng numpy


128

Có cách nào nhanh chóng để "làm phẳng phụ" hoặc chỉ làm phẳng một số kích thước đầu tiên trong một mảng không?

Ví dụ: với một mảng kích thước vô số (50,100,25), các thứ nguyên kết quả sẽ là(5000,25)



Bạn cần một khóa học bồi dưỡng về cắt mảng ndarray numpy. Còn được gọi là lập chỉ mục mảng đa chiều, hãy xem: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html Mảng phân chia ndarray của bạn bằng cách sử dụng dấu ngoặc vuông và sử dụng dấu phân cách dấu phẩy để phân tách từng mảng kích thước bạn muốn. Nó sẽ trông giống như (không chính xác) thế này: your_array[50:100, 7, :]làm phẳng đối tượng 3d thành 2d, chỉ sử dụng lát cắt số 7 cho chiều thứ 2.
Eric Leschinski,

Câu trả lời:


129

Hãy xem 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

Một chút tổng quát hóa cho câu trả lời của Alexander - np.reshape có thể lấy -1 làm đối số, có nghĩa là "tổng kích thước mảng chia cho tích của tất cả các kích thước được liệt kê khác":

ví dụ: làm phẳng tất cả trừ chiều cuối cùng:

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

33

Một chút khái quát cho câu trả lời của Peter - bạn có thể chỉ định một phạm vi trên hình dạng của mảng ban đầu nếu bạn muốn vượt ra ngoài mảng ba chiều.

ví dụ: làm phẳng tất cả trừ hai kích thước cuối cùng :

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

CHỈNH SỬA: Một chút khái quát cho câu trả lời trước đây của tôi - tất nhiên, bạn cũng có thể chỉ định một phạm vi ở đầu của định hình lại:

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
Đã hơn hai năm rồi ... Chúng ta cần một sự khái quát nhỏ khác! ;)
Lith

1

Một cách tiếp cận thay thế là sử dụng numpy.resize()như trong:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.