如何使一个低三角形数组的10,但在对角线上重复n次?



我试图为我拥有的每个项目创建一个10个数组,但随后将这些10个数组放入一个更大的数组中,对角线上用零填充缺失的空间。

这是我正在寻找的一个例子,但只有3的数组。

import numpy as np
arr = np.tri(3,3)
arr

创建的数组如下所示:

[[1,0,0],
[1,1,0],
[1,1,1]]

但是我需要一个10 * n的数组,看起来像这样:(以数组为例,这里使用3,n=2)

{1, 0, 0, 0, 0, 0,1, - 1, 0, 0, 0, 0,1, 1, 1, 0, 0, 0,0, 0, 0, 1 0 0,0, 0, 0, 1, 1, 0,0, 0, 0, 1, 1, 1}

任何帮助将不胜感激,谢谢!

我也试过

df_arr2 = pd.concat([df_arr] * (n), ignore_index=True)
df_arr3 = pd.concat([df_arr2] *(n), axis=1, ignore_index=True)

但是当我只想要对角线时,这会在所有行和列上重复矩阵。

编辑:感谢之前所有的帮助!这个要求现在已经扩大了。我需要包括正向结构的所有排列

有20列(每0.5年递增)如果我有一个1y5y,这一行将有一个1从col3(例如1.5y)开始,并填充1直到col12 (6y标记)。该行的所有其他列都为0。

通过所有排列,它将是0x0.5,0x1,…,5x3.5,5x4,…,9x0.5,9x1

任何帮助将不胜感激!我一直在玩下面由Bas创建的函数(尽管在我最终使用Brandts解决方案之前)。

谢谢!

现在我明白了…AFAIU, OP希望这些np.tri三角形在一个更大的3方形数组的对角线上。

例如,对于n=2:

import numpy as np
n = 2
tri = np.tri(3)
arr = np.zeros((n*3, n*3))
for i in range(0, n*3, 3):
arr[i:i+3,i:i+3] = tri
arr.astype(int)
# Out: 
# array([[1, 0, 0, 0, 0, 0],
#        [1, 1, 0, 0, 0, 0],
#        [1, 1, 1, 0, 0, 0],
#        [0, 0, 0, 1, 0, 0],
#        [0, 0, 0, 1, 1, 0],
#        [0, 0, 0, 1, 1, 1]])

我看到了@brandt的解决方案,这绝对是最好的。如果您想手动构造它们,您可以使用以下方法:

def custom_triangle_matrix(rows, rowlen, tsize):
cm = []
for i in range(rows):
row = []
for j in range(min((i//tsize)*tsize, rowlen)):
row.append(0)
for j in range((i//tsize)*tsize, min(((i//tsize)*tsize) + i%tsize + 1, rowlen)):
row.append(1)
for j in range(((i//tsize)*tsize) + i%tsize + 1, rowlen):
row.append(0)
cm.append(row)
return cm

下面是一些示例执行以及它们使用ppprint的样子:

matrix = custom_triangle_matrix(6, 6, 3)
pprint.pprint(matrix)
[[1, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 1]]
matrix = custom_triangle_matrix(6, 9, 3)
pprint.pprint(matrix)
[[1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0]]
matrix = custom_triangle_matrix(9, 6, 3)
pprint.pprint(matrix)
[[1, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]
matrix = custom_triangle_matrix(10, 10, 5)
pprint.pprint(matrix)
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1]]

祝你好运!

最新更新