如果我理解正确的话,我其实前段时间也遇到过类似的问题。我看到了你的问题,并决定再试一次,但有一个通用的解决方案(适用于 3 或更大的尺寸)。我找不到没有任何循环的方法(对不起),但它非常简单,可以定义为以数组和维度为参数的函数
解决方案
这是我用来从一个数组中生成您所要求的类型的矩阵的代码(请注意,我刚刚删除了字母并使用整数进行演示)。它仍然使用嵌套循环。
import numpy as np
D = [
[11,21,31,22,23,33],
[11,21,31,22,23,33],
[11,21,31,22,23,33]
]
d = 3 # dimension
N = 3 # number of sets (A, B, C) or len(D)
# index offset matrix to index from D
offsets = np.zeros((d, d), dtype=int)
# adjustments to offset matrix at each i,j index
adj = np.arange(d-2, 0, -1)
for i in range(1, d-1):
offsets[i:, i:] += adj[i-1]
cov = np.empty((N, d, d), dtype=int)
# iterate over A, B, C
for n in range(N):
for i in range(d):
for j in range(d):
cov[n, i, j] = D[n][i+j+offsets[i, j]]
print(cov)
打印出来
[[[11 21 31]
[21 22 23]
[31 23 33]]
[[11 21 31]
[21 22 23]
[31 23 33]]
[[11 21 31]
[21 22 23]
[31 23 33]]]
如果你有更大的集合:
D = [
[11, 21, 31, 41, 51, 61, 22, 23, 24, 25, 26, 33, 34, 35, 36, 44, 45, 46, 55, 56, 66],
[11, 21, 31, 41, 51, 61, 22, 23, 24, 25, 26, 33, 34, 35, 36, 44, 45, 46, 55, 56, 66],
[11, 21, 31, 41, 51, 61, 22, 23, 24, 25, 26, 33, 34, 35, 36, 44, 45, 46, 55, 56, 66]
]
d = 6
N = 3
offsets = np.zeros((d, d), dtype=int)
adj = np.arange(d-2, 0, -1)
for i in range(1, d-1):
offsets[i:, i:] += adj[i-1]
cov = np.empty((N, d, d), dtype=int)
for n in range(N):
for i in range(d):
for j in range(d):
cov[n, i, j] = D[n][i+j+offsets[i, j]]
print(cov)
你得到:
[[[11 21 31 41 51 61]
[21 22 23 24 25 26]
[31 23 33 34 35 36]
[41 24 34 44 45 46]
[51 25 35 45 55 56]
[61 26 36 46 56 66]]
[[11 21 31 41 51 61]
[21 22 23 24 25 26]
[31 23 33 34 35 36]
[41 24 34 44 45 46]
[51 25 35 45 55 56]
[61 26 36 46 56 66]]
[[11 21 31 41 51 61]
[21 22 23 24 25 26]
[31 23 33 34 35 36]
[41 24 34 44 45 46]
[51 25 35 45 55 56]
[61 26 36 46 56 66]]]
注意事项
这要求您的输入数组 D 遵循模式
A11, A12, A13, A14, A22, A23, A24, A33, A34, A44
就像您的 3 维问题一样。
我通过将 D 中的索引映射到所需的矩阵上找到了这个解决方案,并发现它们是矩阵索引加上以下子矩阵的一些偏移:
# [[i+j, i+j, i+j, i+j, i+j ],
# [i+j, i+j+3, i+j+3, i+j+3, i+j+3],
# [i+j, i+j+3, i+j+5, i+j+5, i+j+5],
# [i+j, i+j+3, i+j+5, i+j+6, i+j+6],
# [i+j, i+j+3, i+j+5, i+j+6, i+j+6]]
这些偏移量从 0 开始,然后随着 i,j 的增加,它们增加 3,然后是 2,然后是 1。这种模式随着更高的维度缩放。
答案很长,但我希望对您有所帮助,我以前肯定见过并遇到过这个问题。
干杯