鉴于NumPY中的NxM矩阵,我希望将其下采样为NxO矩阵(O <<< M),以便从原始矩阵中等间隔的采样中线性插值NxO矩阵中的值。>
例如,考虑一个3x10的矩阵:
[
[1 2 3 4 5 6 7 8 9 10]
[10 9 8 7 6 5 4 3 2 1 ]
[4 6 4 6 4 6 4 6 4 6 ]
]
如果我将其降采样为3x4矩阵,则值可能会像这样对齐:
1 2 3 4 5 6 7 8 9 10
|---|---|---|---|---|---|---|---|---|
* * * *
1 2 3 4
通常,在将M个原始元素下采样为O个新元素的情况下,应该从(M-1)/(O+1)
中采样第一个元素,并在(M-1)/(O+1)
的步骤中进行其他采样。在上图中可以看到,其中10个原始元素在元素之间产生9个“间隙”。我们希望将这个9个“间隙”的距离分为5个相等的部分(在左右两个元素之间留有相等的间隔,每个元素之间留有相等的间隔)。因此,每个新元素相距9/5 = 1.8个“间隙”:
使用基本线性插值,我们可以说“元素1.8”是元素2的80%加上元素1的20%
因此,我的最终矩阵将如下所示:
[
[2.8 4.6 6.4 8.2]
[8.2 6.4 4.6 2.8]
[4.4 4.8 5.2 5.6]
]
我考虑过只是编写一个用于计算输出值并使用np.apply_along_axis()
方法的函数,但是后来我看到this StackOverflow post表示这样做只是围绕for循环的脆弱包装,更好地向量化您的函数。
那么如何将其向量化?能做到吗?
答案 0 :(得分:1)
尝试此功能
def downsample(m, samples):
weights = np.zeros((m.shape[1], samples))
for n in range(samples):
pos = ((m.shape[1] - 1) / (samples + 1)) * (n + 1)
if pos == np.floor(pos):
weights[int(np.floor(pos)), n] = 1
else:
weights[int(np.ceil(pos)), n] = pos - int(np.floor(pos))
weights[int(np.floor(pos)), n] = int(np.ceil(pos)) - pos
return np.matmul(m, weights)
它将根据您描述的插值创建一个权重矩阵,然后将该权重应用于整个矩阵。