熊猫:填充矩阵的对角线

时间:2017-05-03 21:27:20

标签: python pandas matrix

假设我有一个NxN矩阵(df)。我希望除了df的对角线以外都填充0。有这么简单的方法吗?

4 个答案:

答案 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]])