2011-08-31 54 views
21

Tôi cần một cách nhanh chóng để duy trì hoạt động tối đa của một mảng có nhiều mảng. Ví dụ, nếu mảng của tôi là:Chạy tối đa các giá trị mảng có khối lượng

x = numpy.array([11,12,13,20,19,18,17,18,23,21]) 

Tôi muốn:

numpy.array([11,12,13,20,20,20,20,20,23,23]) 

Rõ ràng tôi có thể làm điều này với một vòng lặp nhỏ:

def running_max(x): 
    result = [x[0]] 
    for val in x: 
     if val > result[-1]: 
      result.append(val) 
     else: 
      result.append(result[-1]) 
    return result 

Nhưng mảng của tôi có hàng trăm hàng ngàn mục và tôi cần phải gọi nó nhiều lần. Có vẻ như có một mẹo vặt để loại bỏ vòng lặp, nhưng tôi dường như không thể tìm thấy bất cứ thứ gì có hiệu quả. Cách khác sẽ là viết phần mở rộng này thành phần mở rộng C, nhưng có vẻ như tôi đang tái phát minh ra bánh xe.

+0

tôi sẽ gọi CPC tối đa tích lũy tối đa đề xuất cửa sổ cho tôi. tiếc là googling cho rằng không bật lên bất cứ điều gì hữu ích. –

+1

tôi không cài đặt có phần, nhưng max.accumulate có thể hoạt động. kiểm tra "tích lũy" trong tài liệu. –

+0

@andrew max không có thuộc tính tích lũy trong gumpy. Đó sẽ là một giải pháp tích hợp tốt mặc dù nó đã làm. – JoshAdel

Trả lời

34

numpy.maximum.accumulate công trình đối với tôi.

>>> import numpy 
>>> numpy.maximum.accumulate(numpy.array([11,12,13,20,19,18,17,18,23,21])) 
array([11, 12, 13, 20, 20, 20, 20, 20, 23, 23]) 
+0

wim đã có ngay trước khi tôi đã làm. –

4

Như đã đề cập, có scipy.maximum.accumulate:

In [9]: x 
Out[9]: [1, 3, 2, 5, 4] 

In [10]: scipy.maximum.accumulate(x) 
Out[10]: array([1, 3, 3, 5, 5]) 
+4

Không cần phải lấy nó từ không gian tên scipy. Đó là một ufunc numpy. Sự trùng lặp của các ký hiệu numpy trong scipy. * Là một khả năng tương thích ngược còn sót lại từ những ngày của Numeric. –

+0

Xin lỗi về điều đó. Cá nhân thiên vị, tôi đoán. –

Các vấn đề liên quan