Cách khuyến khích để làm điều này là để preallocate trước khi vòng lặp và sử dụng cắt và lập chỉ mục để chèn
my_array = numpy.zeros(1,1000)
for i in xrange(1000):
#for 1D array
my_array[i] = functionToGetValue(i)
#OR to fill an entire row
my_array[i:] = functionToGetValue(i)
#or to fill an entire column
my_array[:,i] = functionToGetValue(i)
NumPy không cung cấp một phương pháp array.resize()
, nhưng điều này sẽ xa chậm hơn do chi phí tái phân bổ bộ nhớ bên trong một vòng lặp. Nếu bạn phải có tính linh hoạt, thì tôi e rằng cách duy nhất là tạo một array
từ một số list
.
EDIT: Nếu bạn lo lắng rằng bạn đang phân bổ quá nhiều bộ nhớ cho dữ liệu của mình, tôi sẽ sử dụng phương pháp trên để phân bổ quá mức và sau đó khi vòng lặp hoàn tất, hãy xóa các bit không sử dụng của mảng array.resize()
. Đây sẽ là xa, xa nhanh hơn liên tục phân bổ lại mảng bên trong vòng lặp.
EDIT: Đáp lại bình luận @ user248237 của, giả sử bạn biết bất kỳ một kích thước của mảng (để đơn giản):
my_array = numpy.array(10000, SOMECONSTANT)
for i in xrange(someVariable):
if i >= my_array.shape[0]:
my_array.resize((my_array.shape[0]*2, SOMECONSTANT))
my_array[i:] = someFunction()
#lop off extra bits with resize() here
Nguyên tắc chung là "phân bổ nhiều hơn bạn nghĩ rằng bạn sẽ cần, và nếu mọi thứ thay đổi, hãy thay đổi kích cỡ mảng càng ít lần càng tốt ". Tăng gấp đôi kích thước có thể được coi là quá mức, nhưng trên thực tế, đây là phương pháp được sử dụng bởi một số cấu trúc dữ liệu trong một số thư viện chuẩn trong các ngôn ngữ khác (ví dụ: java.util.Vector
).).
Nguồn
2010-04-14 23:37:23
những gì xảy ra nếu bạn không làm điều đó? – OscarRyz
Lý do không rõ ràng là nhanh như vậy ở nơi đầu tiên là nó hoạt động với mảng kích thước không đổi và không phải danh sách động. Vì vậy, loại bỏ nó chỉ để giảm "lộn xộn" trong mã của bạn có lẽ không đúng cách để đi. Nếu bạn biết kích thước trước (1000) hãy preallocate nó. Nếu bạn không - xây dựng danh sách chắc chắn là cách tốt nhất để đi, vì danh sách python [] khá hiệu quả. – drozzy