我有一个有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]
你可以使用 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.])
你可以分两步来做:首先将你的数据转换成一个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]]
我想这就是你要的。