在 Python 中并行插值许多曲线

问题描述 投票:0回答:2

假设我有一个 N 行 M 列的 NumPy 数组。每行包含 M 个间隔内 N 个函数中每个函数的值。我有一个向量 X,其中包含计算函数时的 x 值。我还有另一个 NumPy 数组,它是长度为 N 的一维向量。我想对 N 个函数中的每一个进行插值,以找到向量中每个 N 点处它们各自的值。例如,如果我有

X = np.array([0.2,0.4,0.6,0.8])
matrix = np.array([[1,2,3,4],
                   [2,4,6,8],
                   [1,3,5,7]]) # N = 3, M = 4
vector = np.array([0.3, 0.6, 0.5])

def f(X, matrix, vector):
   # Some code
   return interpolated_values

interpolated_values
应包含
[1.5, 6, 4]
,因为这些是
matrix
每行在
X
的对应值处线性插值时所具有的值。

我知道我可以使用循环来做到这一点。但是,如果 N 很大,这会很慢。函数

f
中应该包含什么来并行执行此插值?

我猜想如果 X 对于 N 个函数中的每一个来说都不是相同的向量,那么真正的问题就出现了。即,X 不再是 1 x M,而是 N x M。在这种情况下(每个要插值的函数的 x 值不相同),有没有办法并行化插值?

python arrays numpy interpolation
2个回答
0
投票

根据您的需求,

interp
功能会很有用。

import numpy as np

def f(X, matrix, vector):
    interpolated_values = np.apply_along_axis(np.interp, 0, X, matrix, vector)
    return interpolated_values

上述代码解释:

  • np.apply_along_axis(np.interp, 0, X, matrix, vector)
    。这将
    np.interp
    函数应用于矩阵的每一行。
  • np.interp
    。在
    X
    指定的 x 坐标处对向量值进行插值。这将帮助您并行获取每个函数的插值,如果
    N
    很大,这应该比使用循环快得多。

代码演示


0
投票

要并行进行插值,可以使用 numba.prange 装饰器。这将允许您在矩阵的行上并行化 for 循环。

以下是如何执行此操作的示例:

import numpy as np
from numba import prange, jit

def f(X, matrix, vector):
    @jit(nopython=True, fastmath=True, nogil=True, parallel=True)
    def interpolate(X, matrix, vector):
        interpolated_values = np.empty(vector.shape)
        for i in prange(matrix.shape[0]):
            interpolated_values[i] = np.interp(vector[i], X, matrix[i])
        return interpolated_values

    return interpolate(X, matrix, vector)
© www.soinside.com 2019 - 2024. All rights reserved.