2016-01-19 3 views
0

Я иногда, но не часто использовал numpy. Теперь мне нужно делать некоторые суммы, в которых суммы включают индексы строк/столбцов.чистое суммирование с индексом numpy массивов

У меня есть m x n массив S. Я хочу сделать создать новый m x n массив, «s, я» запись

-c i S[s,i] + g (i+1)S[s,i+1] + (s+1)S[s+1,i-1] 

Так сказать S=np.array([[1,2],[3,4], [5,6]]) результат я хочу

-c*np.array([[0*1, 1*2],[0*3, 1*4],[0*5, 1*6]]) 
+ g*np.array([[1*2, 2*0],[1*4, 2*0],[1*6, 2*0]]) 
+ np.array([[1*0, 1*3],[2*0, 2*5],[3*0, 3*0]]) 

(это не все термины в моем уравнении, но я чувствую, что знаю, как это сделать, было бы достаточно, чтобы закончить то, что мне нужно).

Я думаю, что мне нужно будет создать новый массив, строки которого являются только индексом строк и другим соответствующим столбцам. Затем сделайте некоторое компонентное умножение. Но это хорошо вне того, что я обычно делаю в своих исследованиях, поэтому я уже сделал несколько неправильных шагов.

примечание: Понятно, что, когда индексы относятся к чему-то вне моего массива, значение равно нулю.

Есть ли чистый способ сделать суммирование, описанное выше?

+2

Не могли бы вы сделать [воспроизводимый пример] (http://stackoverflow.com/help/mcve)? –

ответ

1

Я хотел бы сделать это в несколько этапов, из-за вашей возможной ограничивающей вне индексации:

import numpy as np 
S = np.array([[1,2],[3,4], [5,6]]) 
c = np.random.rand() 
g = np.random.rand() 

m,n = S.shape 

Stmp1 = S*np.arange(0,n)   # i*S[s,i] 
Stmp2 = S*np.arange(0,m)[:,None] # s*S[s,i] 

# the answer: 
Sout = -c*Stmp1 
Sout[:,:-1] = Sout[:,:-1] + g*Stmp1[:,1:] 
Sout[:-1,1:] = Sout[:-1,1:] + Stmp2[1:,:-1] 

# only for control: 
Sout2 = -c*np.array([[0*1, 1*2],[0*3, 1*4],[0*5, 1*6]]) \ 
     + g*np.array([[1*2, 2*0],[1*4, 2*0],[1*6, 2*0]]) \ 
     + np.array([[1*0, 1*3],[2*0, 2*5],[3*0, 3*0]]) 

Проверил:

In [431]: np.all(Sout==Sout2) 
Out[431]: True 

Я представил вспомогательные массивы i*S[s,i] и s*S[s,i]. Хотя это явно не обязательно, это делает код более удобным для чтения. Мы могли бы легко нарезать в вызовы np.arange(0,n) напрямую, но если память не является проблемой, я считаю этот подход более простым.

Смежные вопросы