映射诊断

2024-04-19 19:35:33 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧:

idx = ['H',"A","B","C","D"]
idxp = idx[1:] + [idx[0]]
idxm = [idx[-1]] + idx[:-1]
idx, idxp, idxm
j = np.arange(25).reshape(5,5)
J = pd.DataFrame(j, index=idx, columns=idx)
np.fill_diagonal(J.values, 0)
J

enter image description here

作为输出,我希望得到如下数组:

  • 在矩阵的下半部分和对角线上到处都有零
  • 在矩阵的上半部分,取矩阵J的对角线上方的数字计算值,因此向量v=[1,7,13,19]。你知道吗
  • 使用v,计算第一行作为v从 从开始到结束并获得[1,8,21,40]
  • 使用v,计算第二行从第二个索引到结尾的v的累计和,得到[7,20,39]
  • 等,直到达到最后一个指标v

换言之,这将为我们提供以下矩阵:

m_exp = np.array([[0,1,8,21,40],
             [0,0,7,20,39],
             [0,0,0,13,32],
             [0,0,0,0,19],
             [0,0,0,0,0],
             ])

到目前为止,我找到的计算此矩阵的最佳方法是使用以下代码:

travelup = np.array([np.pad(np.cumsum(J.values.diagonal(1)[n:]), (n+1,0), 'constant') for n in range(J.values.shape[0])])

然而,这涉及到一个理解列表,在实践中,我的矩阵要大得多,这段代码被称为数千次。你知道吗

是否有任何方法可以通过使用映射来转换流程,从而使其更快地避免循环?你知道吗


Tags: 数据方法代码np矩阵arraypdvalues
1条回答
网友
1楼 · 发布于 2024-04-19 19:35:33

列出了几种方法。你知道吗

一、基本方法

a = J.values
p = np.r_[0,a.ravel()[1::a.shape[1]+1]] # or np.r_[0,np.diag(a,1)]
n = len(p)
out = np.triu(np.broadcast_to(p,(n,n)),1).cumsum(1)

pn将在下面列出的备选方案中重新使用。你知道吗

A.备选方案1

或者使用broadcasted-multiplication获得最终输出-

out = (~np.tri(n, dtype=bool)*p).cumsum(1)

B.备选方案2

或者用outer-subtraction在cumsum上-

c = p.cumsum()
out = np.triu(c-c[:,None])

C.备选方案3

或者用np.tri替换np.triu

out = (c-c[:,None])*~np.tri(n, dtype=bool)

c将在下面列出的备选方案中重新使用。你知道吗

二。与numexpr

对于大型阵列,利用多核和numexpr。因此,备选方案是——

import numexpr as ne

out = ne.evaluate('(c-c2D)*M',{'c2D':c[:,None],'M':~np.tri(n, dtype=bool)})

A.备选方案1

out = ne.evaluate('(c-c2D)*(~M)',{'c2D':c[:,None],'M':np.tri(n, dtype=bool)})

B.备选方案2

r = np.arange(n)
out = ne.evaluate('(c-c2D)*(r2D<r)',{'c2D':c[:,None],'r2D':r[:,None]})

相关问题 更多 >