熊猫:填充矩阵对角线
答
你可以使用np.eye(n)
:
pd.DataFrame(np.eye(5) * np.array([1, 2, 3, 4, 5]))
答
考虑数据框df
df = pd.DataFrame(np.random.randint(10, size=[5, 5]), list('ABCDE'), list('VWXYZ'))
print(df)
V W X Y Z
A 4 6 7 5 4
B 9 7 3 3 0
C 1 9 7 8 2
D 1 9 7 9 9
E 6 6 6 6 1
np.eye
df.mul(np.eye(len(df), dtype=int))
V W X Y Z
A 4 0 0 0 0
B 0 7 0 0 0
C 0 0 7 0 0
D 0 0 0 9 0
E 0 0 0 0 1
重构
填充在对角线
z = np.zeros_like(df)
r = np.arange(len(df))
z[r, r] = df.values[r, r]
pd.DataFrame(z, df.index, df.columns)
V W X Y Z
A 4 0 0 0 0
B 0 7 0 0 0
C 0 0 7 0 0
D 0 0 0 9 0
E 0 0 0 0 1
np.triu_indices
填写关闭对角线
i, j = np.triu_indices(len(df), 1)
df.values[i, j] = 0
df.values[j, i] = 0
df
V W X Y Z
A 4 0 0 0 0
B 0 7 0 0 0
C 0 0 7 0 0
D 0 0 0 9 0
E 0 0 0 0 1
答
一种方法是使用fill_diagonal
从旧矩阵填充对角线的新零矩阵。
import numpy as np
A = np.array([[1,2], [3,4]])
A_d = np.zeros_like(A)
np.fill_diagonal(A_d, A.diagonal())
# A_d
# array([[1, 0],
# [0, 4]])
答
np.diag应该是足够了:
df = pd.DataFrame(np.random.randint(7, size=[6, 6]))
np.diag(np.diag(df))
array([[5, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 3, 0],
[0, 0, 0, 0, 0, 3]])
这是很聪明的。 – trob