Python:矩阵中集合按列的部分和

Python:矩阵中集合按列的部分和,python,loops,matrix,cumsum,Python,Loops,Matrix,Cumsum,我有两个大矩阵(1800L;1800C),epeq和triax,它们的列如下: epeq= 0 1 1 2 1 0 3 3 1 1 0 2 1 1 一, 三轴= -1 1 3 1 -2 -3 -1 1 2 3 2 1 -1 -3 -1 一, 如您所见,三轴柱具有正负元素的循环。我希望在三轴循环的每个循环开始时,epeq中的累积和在循环期间保持不变,如下所示: epeq_cr= 0 1 1 1 1 1 1 11 11 11 11 11 11 11 11 十七, 并将此过程应用于epeq矩阵的所有列

我有两个大矩阵(1800L;1800C),epeq和triax,它们的列如下:

epeq=
0
1
1
2
1
0
3
3
1
1
0
2
1
1
一,

三轴=
-1
1
3
1
-2
-3
-1
1
2
3
2
1
-1
-3
-1
一,

如您所见,三轴柱具有正负元素的循环。我希望在三轴循环的每个循环开始时,epeq中的累积和在循环期间保持不变,如下所示:

epeq_cr=
0
1
1
1
1
1
1
11
11
11
11
11
11
11
11
十七,

并将此过程应用于epeq矩阵的所有列。我有那个代码,但遗漏了一些东西

epeq_cr = np.copy(epeq)
for g in range(1,len(epeq_cr)):
    for h in range(len(epeq_cr[g])):
        if (triax[g-1][h]<0 and triax[g][h]>0):
            epeq_cr[g][h] = np.cumsum()...
epeq\u cr=np.copy(epeq)
对于范围(1,len(epeq_-cr))内的g:
对于范围内的h(len(epeq_cr[g]):
如果(三轴[g-1][h]0):
epeq_cr[g][h]=np.cumsum()。。。

我现在没有时间来研究这一点,但我首先要弄清楚三轴循环的起始点:

epeq = np.array([1, 1, 2, 1, 0, 3, 3, 1, 1, 0, 2, 1, 1, 1])
triax = np.array([-1, 1, 3, 1, -2, -3, -1, 1, 2, 3, 2, 1, -1, -3, -1, 1])

t_shift = np.roll(triax, 1)
t_shift[0] = 0
cycle_starts = np.argwhere((triax > 0) & (t_shift < 0)).flatten()
array([ 1,  7, 15])
epeq=np.array([1,1,2,1,0,3,3,1,1,0,2,1,1,1])
triax=np.数组([-1,1,3,1,-2,-3,-1,1,2,3,2,1,-1,-3,-1,1])
t_shift=np.滚动(三轴,1)
t_移位[0]=0
循环开始=np.arg,其中((三轴>0)和(t_偏移<0)).flatten()
数组([1,7,15])
因此,对于任何位置,i,在epeq\u cr中,您需要在循环开始和求和(epeq[:位置])中找到小于i的最大数。

epeq\u cr=np.copy(epeq)
对于范围(1,len(epeq_-cr))内的g:
对于范围内的h(len(epeq_cr[g]):
如果(三轴[g-1][h]=0):
epeq_cr[g][h]=总和(范围(g+1)内v的epeq[v][h))
其他:
epeq_-cr[g][h]=epeq_-cr[g-1][h]

你到底在总结什么?因此你有一个循环开始的点(当三轴从负向正交叉时)。您输出中的值是上一个周期开始之前epeq中所有值的总和。这是一个奇怪的问题-我会看看是否能解决它(这可能是您可以在scipy中使用convolve的一种方法,但我只看numpy).我希望将epeq矩阵中的所有元素求和到三轴矩阵中每个循环开始之前,并在三轴循环期间保持此部分和。请参见新的epeq(示例中的最后一个矩阵)。我知道我的np.cumsum中遗漏了一些东西,但我不知道如何继续编写代码。输出数组中的第一个值0是初始数组第一行中0的和,还是空列表的和?我是编程初学者。我知道,你给了我每个周期开始的位置。但如何对epeq矩阵中的所有列执行此操作?循环开始的位置是什么?啊,好的。你走对了。这是一个相当复杂的问题来解决时,你才刚刚开始!有了numpy,你可以给它一个2D矩阵(而不是1D),它基本上可以工作。您必须将
t_shift[0]=0
更改为类似
t_shift[0,:]=0
的内容,才能更改整个第一行。
epeq_cr = np.copy(epeq)                                         
for g in range(1,len(epeq_cr)):
    for h in range(len(epeq_cr[g])):
        if (triax[g-1][h]<=0 and triax[g][h]>=0):
            epeq_cr[g][h]=sum(epeq[v][h] for v in range(g+1))
        else:
            epeq_cr[g][h]=epeq_cr[g-1][h]