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ụ.
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:
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)
>>> numpy.array([[1, 2], [3, 4]])
array([[1, 2], [3, 4]])
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 hstack
cách tiếp cận cho việc sử dụng Numpy một cách tao nhã.
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
[...[...[...]]]
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-1
vì một số lý do, người khác đã tạo thêm một lớp - cần điều tra)
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.
Tôi đã có một danh sách các danh sách có độ dài bằng nhau. Ngay cả Ignacio Vazquez-Abrams
câ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)))
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)