Chuyển đổi mảng NumPy thành cấu trúc Danh sách Python?


298

Làm cách nào để chuyển đổi một mảng NumPy thành Danh sách Python (ví dụ [[1,2,3],[4,5,6]]) và thực hiện nhanh chóng một cách hợp lý?

Câu trả lời:


427

Sử dụng tolist():

import numpy as np
>>> np.array([[1,2,3],[4,5,6]]).tolist()
[[1, 2, 3], [4, 5, 6]]

Lưu ý rằng điều này chuyển đổi các giá trị từ bất kỳ loại numpy nào mà chúng có thể có (ví dụ: np.int32 hoặc np.float32) thành "loại Python tương thích gần nhất" (trong danh sách). Nếu bạn muốn duy trì các loại dữ liệu numpy, bạn có thể gọi danh sách () trên mảng của mình và bạn sẽ kết thúc với một danh sách các vô hướng numpy . (Cảm ơn Mr_and_Mrs_D đã chỉ ra điều đó trong một bình luận.)


6
Nếu danh sách của bạn là float32 tolistsẽ chuyển đổi nó thành floatss - điều đó có thể không mong muốn. Sử dụng list(myarray)không phải chịu đựng điều này - tại sao chúng ta nên thích tolist?
Mr_and_Mrs_D

1
@Mr_and_Mrs_D bạn có gợi ý rằng, mặc dù có số float trong mảng của bạn, bạn có muốn danh sách kết quả là số nguyên không? Đó là một câu hỏi hoàn toàn khác ... và tất nhiên bạn phải xác định rằng mặc dù là giá trị float32, tất cả chúng sẽ là không thể thiếu. Dù sao, nếu bạn có tình huống đó, tôi đoán làm myarray.astype(np.int32).tolist()sẽ là một lựa chọn và rõ ràng về những gì bạn đang cố gắng thực hiện. (Và cuối cùng, list(array_of_type_float32)không cung cấp số nguyên ở đây khi tôi thử nó ... vì vậy tôi không biết bạn đang hỏi gì.)
Peter Hansen

1
Tôi chưa bao giờ đề cập đến số nguyên - thửfloat32_array = np.array([0.51764709], np.float32); print(float32_array.tolist()); print(list(float32_array))
Mr_and_Mrs_D

2
Được rồi, do đó, một chuyển đổi thành [float] và cái còn lại sử dụng kiểu float32 vô hướng numpy vẫn còn, như [np.float32]. Khỏe. Điều tốt để biết, nhưng tôi đoán liệu nó có mong muốn hay không phụ thuộc vào từng trường hợp cụ thể. Về giá trị của nó, tôi nghi ngờ rằng nhìn chung khi ai đó (như OP) yêu cầu chuyển đổi thành danh sách, họ hoàn toàn có nghĩa là một danh sách các loại dữ liệu Python thông thường, trong trường hợp này là trôi nổi hoặc số nguyên, và không phải là danh sách các loại vô hướng hỗn độn . Cảm ơn bạn đã chỉ ra điều này: Tôi đã chỉnh sửa câu trả lời để bao gồm một ghi chú về điều đó.
Peter Hansen

Dọc theo những dòng đó: np.array([[0, 'one'], ['two', 3]]).tolist() -> [['0', 'one'], ['two', '3']]
keithpjcar 20/03/19

11

Phương thức numpy .tolist tạo ra các danh sách lồng nhau nếu hình dạng mảng numpy là 2D.

nếu danh sách phẳng được mong muốn, phương pháp dưới đây hoạt động.

import numpy as np
from itertools import chain

a = [1,2,3,4,5,6,7,8,9]
print type(a), len(a), a
npa = np.asarray(a)
print type(npa), npa.shape, "\n", npa
npa = npa.reshape((3, 3))
print type(npa), npa.shape, "\n", npa
a = list(chain.from_iterable(npa))
print type(a), len(a), a`

5

tolist()hoạt động tốt ngay cả khi gặp một mảng lồng nhau, nói một con gấu trúc DataFrame;

my_list = [0,1,2,3,4,5,4,3,2,1,0]
my_dt = pd.DataFrame(my_list)
new_list = [i[0] for i in my_dt.values.tolist()]

print(type(my_list),type(my_dt),type(new_list))


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.