2012-04-12 35 views
22

Tôi muốn có thể 'xây dựng' một mảng numpy trên bay, tôi không biết kích thước của mảng này trước.Khởi tạo mảng không rõ ràng có độ dài không xác định

Ví dụ tôi muốn làm một cái gì đó như thế này:

a= np.array() 
for x in y: 
    a.append(x) 

nào sẽ cho kết quả trong một chứa tất cả các phần tử của x, rõ ràng đây là một câu trả lời tầm thường. Tôi chỉ tò mò cho dù điều này là có thể?

+2

Cách tiếp cận hiệu quả hơn là phân bổ một số mảng lớn và tăng gấp đôi kích thước của nó mỗi khi bạn đạt đến dung lượng. – wim

Trả lời

48

Xây dựng một danh sách Python và chuyển đổi đó để một mảng NumPy. Điều đó được tính khấu hao O (1) lần cho mỗi phụ thêm + O (n) để chuyển đổi thành mảng, với tổng số là O (n).

a = [] 
    for x in y: 
     a.append(x) 
    a = np.array(a) 
+0

Hoặc vẫn tốt hơn: 'a = np.array ([x cho x trong y])'; hoặc chỉ 'a = np.array (danh sách (y))' –

8

Bạn có thể làm điều này:

a = np.array([]) 
for x in y: 
    a = np.append(a, x) 
+5

Điều đó mất thời gian tuyến tính cho mỗi phụ thêm. –

+6

Cách tiếp cận này sao chép mảng mỗi chắp thêm, là O (tổng (khoảng (n))). Trên máy tính xách tay của tôi, phương pháp này chậm hơn 42 lần so với phương pháp @ larsman: Xây dựng một danh sách theo phương pháp larsmans chính xác đưa tôi 1000 vòng, tốt nhất là 3: 1,53 ms mỗi vòng lặp. Theo phương pháp này chính xác tôi sẽ mất 10 vòng, tốt nhất là 3: 64,8 ms mỗi vòng lặp. –

1

Đối với hậu thế, tôi nghĩ rằng đây là nhanh hơn:

a = np.array([np.array(list()) for _ in y]) 

Bạn thậm chí có thể có thể vượt qua trong một máy phát điện (ví dụ: [] ->()), trong trường hợp danh sách bên trong là không bao giờ được lưu trữ đầy đủ trong bộ nhớ.


Đáp để bình luận dưới đây:

>>> import numpy as np 
>>> y = range(10) 
>>> a = np.array([np.array(list) for _ in y]) 
>>> a 
array([array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object)], dtype=object) 
+0

Tôi đã thực hiện một thay đổi ở đây: danh sách (_) và hoạt động tuyệt vời – javadba

+0

Để rõ ràng @javadba, bạn không cần phải làm điều đó - tôi chắc chắn có một số Pythonistas người sẽ có hành vi phạm tội :) – BenDundee

+0

Đây không phải là vấn đề về phong cách. mà không có danh sách (_) nó thậm chí không làm việc cuối cùng cho trường hợp tôi có y là một mảng chính nó – javadba

0
a = np.empty(0) 
for x in y: 
    a = np.append(a, x) 
4

Kể từ khi y là một iterable Tôi thực sự không hiểu tại sao các cuộc gọi để nối thêm:

a = np.array(list(y)) 

sẽ làm và nó nhiều nhanh hơn:

import timeit 

print timeit.timeit('list(s)', 's=set(x for x in xrange(1000))') 
# 23.952975494633154 

print timeit.timeit("""li=[] 
for x in s: li.append(x)""", 's=set(x for x in xrange(1000))') 
# 189.3826994248866 
Các vấn đề liên quan