2016-07-29 31 views

Trả lời

14
z[1:] -= z[:-1].copy() 

Ngắn và ngọt, không có vòng lặp Python chậm. Chúng tôi có quan điểm của tất cả, nhưng các yếu tố đầu tiên (z[1:]) và tất cả, nhưng cuối cùng (z[:-1]), và trừ yếu tố. Bản sao đảm bảo chúng tôi trừ các giá trị phần tử gốc thay vì các giá trị mà chúng tôi đang tính toán. (On NumPy 1.13 and up, bạn có thể bỏ qua cuộc gọi copy.)

+0

Tôi không nghĩ rằng công trình này, tôi nhận được thông điệp này lỗi: AttributeError: 'danh sách' đối tượng không có thuộc tính 'bản sao' – Pedro

+0

@Pedro: Đó là bởi vì bạn đang sử dụng một danh sách thay vì một mảng. Mặc dù ký hiệu của câu hỏi, 'np.cumsum' trả về một mảng. – user2357112

+0

Đúng vậy! – Pedro

5

Bạn có thể sử dụng np.diff để tính toán các phần tử 1...N sẽ lấy sự khác biệt giữa hai yếu tố bất kỳ. Đây là đối diện của cumsum. Sự khác biệt duy nhất là diff sẽ không trả lại phần tử đầu tiên, nhưng phần tử đầu tiên là giống nhau trong đầu ra ban đầu và cumsum vì vậy chúng tôi chỉ sử dụng lại giá trị đó.

orig = np.insert(np.diff(z), 0, z[0]) 

Thay vì insert, bạn cũng có thể sử dụng np.concatenate

orig = np.concatenate((np.array(z[0]).reshape(1,), np.diff(z))) 

Chúng tôi cũng có thể chỉ cần sao chép và thay thế các yếu tố 1...N

orig = z.copy() 
orig[1:] = np.diff(z) 
1

ưa thích của tôi:

orig = np.r_[z[0], np.diff(z)] 
1

Nếu bạn muốn giữ z, bạn có thể sử dụng np.ediff1d:

x = np.ediff1d(z, to_begin=z[0]) 
Các vấn đề liên quan