我正试图在熊猫的数据中增加主要的对角线,我不知道如何以一种计算上合理的方式进行。
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等等,
注:我正在处理的矩阵不是方阵,而是矩形矩阵。
发布于 2019-08-16 15:37:05
您可以在这里使用一个sparse对角线矩阵,并进行一些细化。这假设原始矩阵中的所有非零元素,否则将无法工作。
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
array([[231, 32, 5],
[ 60, 77, 8],
[ 9, 10, 11]], dtype=int64)发布于 2019-08-16 15:51:40
这里有一个基于NumPy的
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)发布于 2019-08-16 15:27:57
正如Chris提到的,这是按相反顺序排列的cumprod:
# 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')产出:
level_1 0 1 2
level_0
0 231 32 5
1 60 77 8
2 9 10 11https://stackoverflow.com/questions/57527024
复制相似问题