2017-05-03 115 views

回答

1

你可以使用np.eye(n)

pd.DataFrame(np.eye(5) * np.array([1, 2, 3, 4, 5]))

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 
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]]) 
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]]) 
+0

这是很聪明的。 – trob