python - 如何使用 NumPY 对缩小函数进行矢量化?

标签 python numpy matrix

给定 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“间隙”:

  • 新元素 0 = 旧元素 1.8
  • 新元素 1 = 旧元素 3.6
  • 新元素 2 = 旧元素 5.4
  • 新元素 3 = 旧元素 7.2

使用基本的线性插值,我们可以说“元素 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 循环的一个脆弱的包装,你最好对你的函数进行向量化。

那么如何对其进行向量化呢?可以吗?

最佳答案

试试这个功能

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)

它根据您描述的插值创建一个权重矩阵,然后将该权重应用于整个矩阵。

关于python - 如何使用 NumPY 对缩小函数进行矢量化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58630618/

相关文章:

python - 如何将 .parquet 文件从本地计算机上传到 Azure Storage Data Lake Gen2?

python - 在python中的numpy数组中查找第一个有条件的元素的索引

java - 使用 thymeleaf 渲染矩阵(或网格)

python - 使用 ImageField 对 Django ModelForm 进行单元测试,测试显示无效表单

python - 带有 RabbitMQ 的 celeryd 卡在 "mingle: searching for neighbors"上,但普通的 celery 可以工作

python - 从列表中删除空项 (Python)

python - 使用列数组向量化 pandas 数据框列查找

python - 如何在matplotlib的Axes3D中设置zdir以获得更好的瀑布图

不跨越矩阵边界的验证函数(迷宫)

c++ - 使用动态规划打印矩阵中所有可能路径中总和最小的路径