假设我有一个NxN矩阵(df)。我希望除了df的对角线以外都填充0。有这么简单的方法吗?
答案 0 :(得分:1)
您可以使用np.eye(n)
:
pd.DataFrame(np.eye(5) * np.array([1, 2, 3, 4, 5]))
答案 1 :(得分:1)
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]])
答案 2 :(得分:0)
考虑数据框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
答案 3 :(得分:0)
一种方法是使用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]])