在矩阵中填入一个平面列表,同时跳过对角线。

问题描述 投票:0回答:1

我有一个有156个元素的平面列表,这些元素来自一个13x13矩阵的排列组合。我想用这个列表中的元素按列填充一个13x13矩阵,同时跳过矩阵的对角线元素。我假设有某种方法可以在行指数 !=列指数时才循环填充矩阵中的元素,但不知道怎么写。

代码如下。本质上是在一个13x13的矩阵上运行对偶格兰杰因果关系,元素是一个bool向量,代表每个滞后是否显著。我把它变成了一个字符串,以便能够把它放到matrixdataframe中建立一个表格进行可视化展示。

我想把列表中的每个元素(长度为156)填充到一个13x13的矩阵(或Dataframe)中,同时把对角线留空。

from itertools import permutations
perms = list(permutations(df_weeklyret.columns,2))
model_perms = []
for i in range(0, len(perms)):
    countries =  list(perms[i])
    data = df_weeklyret[countries]
    gc_res = grangercausalitytests(data, 4,verbose=False)
    p_vector = [gc_res[lag][0]['ssr_ftest'][1] for lag in range(1,5)]
    final = [1 if i <0.05 else 0 for i in p_vector]
    model_perms.append(final)

elements = [(str(x)) for x in model_perms]
python numpy-ndarray
1个回答
1
投票

你可以使用 np.eye() 来获得对角线的掩码(如果您反转掩码,则获得对角线外的掩码)。

>> a = np.linspace(1,9,9).reshape((3,3))
array([[1., 2., 3.],
       [4., 5., 6.],
       [7., 8., 9.]])

>> a[~np.eye(*a.shape,dtype=bool)]
array([2., 3., 4., 6., 7., 8.])

0
投票

你可以分两步来做:首先将你的数据转换成一个13x12的列表(也就是13个长度为12的列表),然后在每一行的 "对角线 "位置插入一个空值。

# Just some sample data
elements = list(range(156)) 

# Group into rows of size 12
rows = [elements[start:start+12] for start in range(0, 156, 12)] 

# Insert Nones (or whatever you prefer) along the diagonal
for i, row in enumerate(rows): 
    row.insert(i, None) 

这将导致

[[None, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
 [12, None, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
 [24, 25, None, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],
 [36, 37, 38, None, 39, 40, 41, 42, 43, 44, 45, 46, 47],
 [48, 49, 50, 51, None, 52, 53, 54, 55, 56, 57, 58, 59],
 [60, 61, 62, 63, 64, None, 65, 66, 67, 68, 69, 70, 71],
 [72, 73, 74, 75, 76, 77, None, 78, 79, 80, 81, 82, 83],
 [84, 85, 86, 87, 88, 89, 90, None, 91, 92, 93, 94, 95],
 [96, 97, 98, 99, 100, 101, 102, 103, None, 104, 105, 106, 107],
 [108, 109, 110, 111, 112, 113, 114, 115, 116, None, 117, 118, 119],
 [120, 121, 122, 123, 124, 125, 126, 127, 128, 129, None, 130, 131],
 [132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, None, 143],
 [144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, None]]

我想这就是你要的。

© www.soinside.com 2019 - 2024. All rights reserved.