假设我有一个 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 值不相同),有没有办法并行化插值?
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
很大,这应该比使用循环快得多。要并行进行插值,可以使用 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)