首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在潘达斯中增加主导对角线值?

在潘达斯中增加主导对角线值?
EN

Stack Overflow用户
提问于 2019-08-16 15:08:07
回答 4查看 280关注 0票数 3

我正试图在熊猫的数据中增加主要的对角线,我不知道如何以一种计算上合理的方式进行。

代码语言:javascript
复制
df =       [ 3  4  5
             6  7  8
             9 10 11]

ouput_df = [231 32 5
            60  77 8
             9  10 11]

解释-第一要素为3*7* 11,第二要素为4*8,第五要素为7* 11等等,

注:我正在处理的矩阵不是方阵,而是矩形矩阵。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-08-16 15:37:05

您可以在这里使用一个sparse对角线矩阵,并进行一些细化。这假设原始矩阵中的所有非零元素,否则将无法工作。

代码语言:javascript
复制
from scipy import sparse

a = df.to_numpy()
b = sparse.dia_matrix(a)
c = b.data[:, ::-1]
cp = np.cumprod(np.where(c != 0, c, 1), axis=1)
b.data = cp[:, ::-1]
b.A

代码语言:javascript
复制
array([[231,  32,   5],
       [ 60,  77,   8],
       [  9,  10,  11]], dtype=int64)
票数 2
EN

Stack Overflow用户

发布于 2019-08-16 15:51:40

这里有一个基于NumPy的

代码语言:javascript
复制
def cumprod_upper_diag(a):
    m,n = a.shape
    mask = ~np.tri(m,n, dtype=bool)
    p = np.ones((m,n),dtype=a.dtype)
    p[mask[:,::-1]] = a[mask]
    a[mask] = p[::-1].cumprod(0)[::-1][mask[:,::-1]]
    return a

a = df.to_numpy(copy=False) # For older versions : a = df.values
out = a.copy()
cumprod_upper_diag(out)
cumprod_upper_diag(out.T)
out.ravel()[::a.shape[1]+1] = out.ravel()[::out.shape[1]+1][::-1].cumprod()[::-1]
out_df = pd.DataFrame(out)
票数 3
EN

Stack Overflow用户

发布于 2019-08-16 15:27:57

正如Chris提到的,这是按相反顺序排列的cumprod

代码语言:javascript
复制
# stack for groupby
new_df = df.stack().reset_index()[::-1]

# diagonals meaning col_num - row_num are the same
diags = new_df['level_0']-new_df['level_1']

# groupby diagonals
new_df['out'] = new_df.groupby(diags)[0].cumprod()

# pivot to get the original shape
new_df.pivot('level_0', 'level_1', 'out')

产出:

代码语言:javascript
复制
level_1    0   1   2
level_0             
0        231  32   5
1         60  77   8
2          9  10  11
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57527024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档