gpt4 book ai didi

python - 从给定的 numpy 数组创建 block 对角 numpy 数组

转载 作者:太空狗 更新时间:2023-10-29 20:10:45 27 4
gpt4 key购买 nike

我有一个列数和行数相等的二维 numpy 数组。我想将它们排列成一个更大的阵列,对角线上有较小的阵列。应该可以指定起始矩阵在对角线上的频率。例如:

a = numpy.array([[5, 7], 
[6, 3]])

因此,如果我希望这个数组在对角线上出现 2 次,则所需的输出将是:

array([[5, 7, 0, 0], 
[6, 3, 0, 0],
[0, 0, 5, 7],
[0, 0, 6, 3]])

3次:

array([[5, 7, 0, 0, 0, 0], 
[6, 3, 0, 0, 0, 0],
[0, 0, 5, 7, 0, 0],
[0, 0, 6, 3, 0, 0],
[0, 0, 0, 0, 5, 7],
[0, 0, 0, 0, 6, 3]])

对于任意大小的起始数组(仍然考虑起始数组具有相同的行数和列数),有没有一种快速的方法来实现它?

最佳答案

方法 #1

经典案例numpy.kron -

np.kron(np.eye(r,dtype=int),a) # r is number of repeats

sample 运行-

In [184]: a
Out[184]:
array([[1, 2, 3],
[3, 4, 5]])

In [185]: r = 3 # number of repeats

In [186]: np.kron(np.eye(r,dtype=int),a)
Out[186]:
array([[1, 2, 3, 0, 0, 0, 0, 0, 0],
[3, 4, 5, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 2, 3, 0, 0, 0],
[0, 0, 0, 3, 4, 5, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 2, 3],
[0, 0, 0, 0, 0, 0, 3, 4, 5]])

方法 #2

另一种高效的 diagonal-viewed-array-assignment -

def repeat_along_diag(a, r):
m,n = a.shape
out = np.zeros((r,m,r,n), dtype=a.dtype)
diag = np.einsum('ijik->ijk',out)
diag[:] = a
return out.reshape(-1,n*r)

sample 运行-

In [188]: repeat_along_diag(a,3)
Out[188]:
array([[1, 2, 3, 0, 0, 0, 0, 0, 0],
[3, 4, 5, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 2, 3, 0, 0, 0],
[0, 0, 0, 3, 4, 5, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 2, 3],
[0, 0, 0, 0, 0, 0, 3, 4, 5]])

关于python - 从给定的 numpy 数组创建 block 对角 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33508322/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com