2013-05-14 59 views
19

Bất kỳ ai cũng có thể giới thiệu một cách để thực hiện tổng tích lũy ngược trên một mảng không?Thực hiện tổng tích lũy ngược trên một mảng có nhiều mảng

đâu 'tổng tích lũy ngược' được định nghĩa như sau (tôi hoan nghênh bất kỳ sự điều chỉnh về tên cho thủ tục này):

nếu

x = np.array([0,1,2,3,4]) 

sau đó

np.cumsum(x) 

cho

array([0,1,3,6,10]) 

Tuy nhiên, tôi muốn có được

array([10,10,9,7,4] 

bất cứ ai có thể đề xuất một cách để làm điều này?

Trả lời

34

này làm nó:

np.cumsum(x[::-1])[::-1] 
+0

Một cách tương đương, nhưng cú pháp khác nhau là: x [:: - 1] .cumsum() [:: - 1] – Staza

-2

Đối với những niềm vui của nó, sử dụng chức năng ẩn danh:

array = [0,1,2,3,4] 

reverse = lambda a: a[::-1] 
cumsum = lambda a: [ sum(a[:i+1]) for i,x in enumerate(a) ] # there is also an accumulate function present in the itertools module 

print reverse(array) 
print cumsum(array) 

# sadly, no compose function in Python 
reverse_cumsum = lambda a: reverse( cumsum (reverse(a))) 

print reverse_cumsum(array) 

Kết quả:

[4, 3, 2, 1, 0] 
[0, 1, 3, 6, 10] 
[10, 10, 9, 7, 4] 
+2

FYI: 'a = np.random.randint (100, size = (1000))', '% timeit reverse_cumsum (a)': '1 vòng, tốt nhất là 3: 315 ms mỗi vòng','% timeit np.cumsum (a [:: - 1]) [:: - 1] ':' 100000 vòng, tốt nhất là 3: 8.89 µs trên mỗi vòng lặp'. (Nếu tôi chuyển từ 'cumsum' thành numpy, thì đó là' 9.75 µs trên mỗi vòng lặp', do đó, các cuộc gọi hàm không thêm nhiều chi phí, nó chỉ là việc thực hiện-in-python-và-nhiều lần-tổng-cho- không có lý do thực sự có tốc độ chậm 35000x.) – Dougal

9

Chỉ cần cho các hồ sơ: np.sum(x) - np.cumsum(x) cũng một là tùy chọn nhưng nhanh hơn một nửa so với các mảng lớn (nơi tốc độ quan trọng):

In [8]: x = np.ones(1e8) 

In [9]: %timeit np.cumsum(x[::-1])[::-1] 
1 loops, best of 3: 547 ms per loop 

In [10]: %timeit np.sum(x) - np.cumsum(x) 
1 loops, best of 3: 974 ms per loop 

và ít thanh lịch khi muốn làm một cumsum dọc theo một số khía cạnh khác hơn là người đầu tiên:

x = np.ones((1e3,1e3)) 
np.sum(x,axis=-1)[:,np.newaxis] - np.cumsum(x,axis=-1) 
1

Bạn có thể sử dụng .flipud() cho điều này là tốt, tương đương với [::-1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.flipud.html

In [0]: x = np.array([0,1,2,3,4]) 

In [1]: np.flipud(np.flipud(x).cumsum()) 
Out[1]: array([10, 10, 9, 7, 4] 

.flip() mới là NumPy 1.12 và kết hợp .flipud().fliplr() thành một API. https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html

Đây là tương đương, và có chức năng ít cuộc gọi:

np.flip(np.flip(x, 0).cumsum(), 0) 
Các vấn đề liên quan