Danh sách các danh sách thành mảng numpy


183

Làm thế nào để tôi chuyển đổi một danh sách đơn giản các danh sách thành một mảng numpy? Các hàng là danh sách con riêng lẻ và mỗi hàng chứa các thành phần trong danh sách phụ.

Câu trả lời:


199

Nếu danh sách danh sách của bạn chứa các danh sách có số lượng phần tử khác nhau thì câu trả lời của Ignacio Vazquez-Abrams sẽ không hoạt động. Thay vào đó, có ít nhất 3 tùy chọn:

1) Tạo một mảng các mảng:

x=[[1,2],[1,2,3],[1]]
y=numpy.array([numpy.array(xi) for xi in x])
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'numpy.ndarray'>

2) Tạo một loạt các danh sách:

x=[[1,2],[1,2,3],[1]]
y=numpy.array(x)
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'list'>

3) Đầu tiên làm cho các danh sách có độ dài bằng nhau:

x=[[1,2],[1,2,3],[1]]
length = max(map(len, x))
y=numpy.array([xi+[None]*(length-len(xi)) for xi in x])
y
>>>array([[1, 2, None],
>>>       [1, 2, 3],
>>>       [1, None, None]], dtype=object)

15
Cảm ơn, đã đến đây vì điều này. Đã sử dụng numpy trong một thời gian, và thấy hành vi này là không tầm thường. Cảm ơn đã dành thời gian để giải thích trường hợp tổng quát hơn này.
Adam Hughes

dtype=floathoạt động quá, nó sẽ chuyển đổi Nonesang np.nan, có thể hữu ích.

107
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])

13
điều này tự động chuyển đổi danh sách danh sách trong một mảng 2D vì độ dài của tất cả các danh sách được bao gồm là như nhau. Bạn có biết làm thế nào để không làm điều đó: tạo một mảng danh sách ngay cả khi tất cả các danh sách có cùng độ dài không? Hoặc có thể chuyển đổi một mảng 2D trong mảng 1D của mảng 1D (ý tôi là không có phương pháp lặp hoặc công cụ bản đồ python)
Juh_

7
Nếu điều đó không phù hợp với bạn vì danh sách phụ của bạn không có kích thước chẵn, hãy xem câu trả lời sau .
Nikana Reklawyks

@NikanaReklawyks Tôi đã bối rối sau khi xem câu trả lời nhưng nhận xét của bạn rất hữu ích. Tôi phát hiện ra rằng danh sách các danh sách của tôi đã bị lởm chởm, khi mà nó không phải là như vậy.
Nikhil Girraj

39

Vì đây là tìm kiếm hàng đầu trên Google để chuyển đổi danh sách danh sách thành mảng Numpy, tôi sẽ cung cấp các câu hỏi sau mặc dù câu hỏi đã được 4 tuổi:

>>> x = [[1, 2], [1, 2, 3], [1]]
>>> y = numpy.hstack(x)
>>> print(y)
[1 2 1 2 3 1]

Khi tôi lần đầu tiên nghĩ làm theo cách này, tôi khá hài lòng với bản thân mình vì nó quá đơn giản. Tuy nhiên, sau khi định thời gian với danh sách danh sách lớn hơn, thực sự nhanh hơn để làm điều này:

>>> y = numpy.concatenate([numpy.array(i) for i in x])
>>> print(y)
[1 2 1 2 3 1]

Lưu ý rằng câu trả lời số 1 của @ Bastiaan không tạo một danh sách liên tục duy nhất, do đó tôi đã thêm concatenate.

Dù sao ... tôi thích hstackcách tiếp cận cho việc sử dụng Numpy một cách tao nhã.


12
trong khi một số người có thể đang tìm kiếm điều này, tôi khá chắc chắn rằng OP muốn có một nparr đa chiều.
Nathan

1
Tôi đang tìm cái này :))
Pallie

26

Nó đơn giản như:

>>> lists = [[1, 2], [3, 4]]
>>> np.array(lists)
array([[1, 2],
       [3, 4]])

6

Một lần nữa, sau khi tìm kiếm vấn đề chuyển đổi danh sách lồng nhau với cấp độ N thành mảng N chiều, tôi không tìm thấy gì, vì vậy đây là cách của tôi xung quanh nó:

import numpy as np

new_array=np.array([[[coord for coord in xk] for xk in xj] for xj in xi], ndmin=3) #this case for N=3

Lưu ý rằng nếu bạn đã có cấu trúc danh sách lồng nhau, bạn không cần [...[...[...]]]phần đó. Bạn chỉ cần gọi np.array, với ndmin=number-of-list-layers. (mặc dù trong trường hợp của tôi, tôi cần ndmin=number-of-list-layers-minus-1vì một số lý do, người khác đã tạo thêm một lớp - cần điều tra)
Venryx

À, vấn đề trong trường hợp của tôi là đối với "lớp danh sách" sâu nhất, các danh sách không có cùng độ dài, điều này chỉ khiến np.array"bọc" những danh sách sâu nhất đó thay vì chuyển chúng thành các mảng khó hiểu.
Venryx

-2

Tôi đã có một danh sách các danh sách có độ dài bằng nhau. Ngay cả Ignacio Vazquez-Abramscâu trả lời sau đó cũng không phù hợp với tôi. Tôi đã nhận được một mảng numpy 1-D có các phần tử là danh sách. Nếu bạn gặp phải vấn đề tương tự, bạn có thể sử dụng phương pháp dưới đây

Sử dụng numpy.vstack

import numpy as np

np_array = np.empty((0,4), dtype='float')
for i in range(10)
     row_data = ...   # get row_data as list
     np_array = np.vstack((np_array, np.array(row_data)))

1
Tại sao trên trái đất bạn sẽ tiếp tục xếp chồng nếu bạn biết rằng bạn có 10 danh sách, tại sao không np.empty ((10, 4)) và sau đó chỉ cần điền vào?
Mehdi

-4

Chỉ cần sử dụng gấu trúc

list(pd.DataFrame(listofstuff).melt().values)

cái này chỉ hoạt động cho một danh sách các danh sách

nếu bạn có một danh sách danh sách các danh sách bạn có thể muốn thử một cái gì đó dọc theo dòng

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
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.