Chuyển đổi mảng 1D sang mảng 2D trong numpy


118

Tôi muốn chuyển đổi mảng 1 chiều thành mảng 2 chiều bằng cách chỉ định số cột trong mảng 2D. Một cái gì đó sẽ hoạt động như thế này:

> import numpy as np
> A = np.array([1,2,3,4,5,6])
> B = vec2matrix(A,ncol=2)
> B
array([[1, 2],
       [3, 4],
       [5, 6]])

Numpy có một hàm hoạt động giống như hàm tạo của tôi "vec2matrix" không? (Tôi hiểu rằng bạn có thể lập chỉ mục mảng 1D giống như mảng 2D, nhưng đó không phải là tùy chọn trong mã tôi có - Tôi cần thực hiện chuyển đổi này.)

Câu trả lời:


163

Bạn muốn reshapemảng.

B = np.reshape(A, (-1, 2))

trong đó -1suy ra kích thước của thứ nguyên mới từ kích thước của mảng đầu vào.


44

Bạn có hai lựa chọn:

  • Nếu bạn không còn muốn hình dạng ban đầu, cách đơn giản nhất là chỉ định một hình dạng mới cho mảng

    a.shape = (a.size//ncols, ncols)

    Bạn có thể chuyển đổi a.size//ncolsbằng cách -1tự động tính hình dạng phù hợp. Hãy chắc chắn rằng a.shape[0]*a.shape[1]=a.size, nếu không bạn sẽ gặp phải một số vấn đề.

  • Bạn có thể nhận một mảng mới với np.reshapehàm, hoạt động gần giống như phiên bản được trình bày ở trên

    new = np.reshape(a, (-1, ncols))

    Khi có thể, newsẽ chỉ là một khung nhìn của mảng ban đầu a, nghĩa là dữ liệu được chia sẻ. Tuy nhiên, trong một số trường hợp, newmảng sẽ rất khó thay thế. Lưu ý rằng np.reshapecũng chấp nhận một từ khóa tùy chọn ordercho phép bạn chuyển từ thứ tự C chính hàng sang thứ tự Fortran chính theo cột. np.reshapelà phiên bản hàm của a.reshapephương thức.

Nếu bạn không thể tôn trọng yêu cầu a.shape[0]*a.shape[1]=a.size, bạn đang gặp khó khăn với việc phải tạo một mảng mới. Bạn có thể sử dụng np.resizechức năng và trộn nó với np.reshape, chẳng hạn như

>>> a =np.arange(9)
>>> np.resize(a, 10).reshape(5,2)

9

Hãy thử một cái gì đó như:

B = np.reshape(A,(-1,ncols))

Tuy nhiên, bạn cần đảm bảo rằng bạn có thể chia số phần tử trong mảng của mình ncols. Bạn cũng có thể chơi với thứ tự các số được kéo vào Bbằng cách sử dụng ordertừ khóa.


4

Nếu mục đích duy nhất của bạn là chuyển đổi mảng 1d X thành mảng 2d chỉ cần làm:

X = np.reshape(X,(1, X.size))

0
import numpy as np
array = np.arange(8) 
print("Original array : \n", array)
array = np.arange(8).reshape(2, 4)
print("New array : \n", array)

1
Tốt hơn là bạn nên bao gồm một số giải thích cùng với mã.
Sid

Bạn có thể giải thích câu trả lời của bạn bây giờ khác với câu trả lời trước và các câu trả lời khác ở trên, cũng sử dụng np.reshape không?
StupidWolf

0
some_array.shape = (1,)+some_array.shape

hoặc lấy một cái mới

another_array = numpy.reshape(some_array, (1,)+some_array.shape)

Điều này sẽ làm cho kích thước +1, tương đương với việc thêm một dấu ngoặc nhọn ở ngoài cùng


-1

Bạn có thể sử dụng flatten()từ gói numpy.

import numpy as np
a = np.array([[1, 2],
       [3, 4],
       [5, 6]])
a_flat = a.flatten()
print(f"original array: {a} \nflattened array = {a_flat}")

Đầu ra:

original array: [[1 2]
 [3 4]
 [5 6]] 
flattened array = [1 2 3 4 5 6]

AttributeError: module 'numpy' has no attribute 'flatten'
Jamie F

1
Bạn có thể chia sẻ mã của bạn? Vì chắc chắn numpy có flattenphương thức: docs.scipy.org/doc/numpy/reference/generated/…
Rafi

-2

Thay đổi mảng 1D thành mảng 2D mà không cần sử dụng Numpy.

l = [i for i in range(1,21)]
part = 3
new = []
start, end = 0, part


while end <= len(l):
    temp = []
    for i in range(start, end):
        temp.append(l[i])
    new.append(temp)
    start += part
    end += part
print("new values:  ", new)


# for uneven cases
temp = []
while start < len(l):
    temp.append(l[start])
    start += 1
    new.append(temp)
print("new values for uneven cases:   ", new)
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.