首页 > 解决方案 > 如何在 Python 中插入未排序的 2D numpy 数组并将插入的值与原始值进行比较?

问题描述

我正在尝试插入 SVD 分解的模式系数。我有一个二次方程ax^2 + bx,随机ab。然后我用二次的值填充一个矩阵y,然后使用svd. c1现在我需要对代码中给出的第一种模式的结果系数进行插值,a介于b0 和 1 之间。在过去的几天里,我尝试了很多东西,但没有一个有效,关于插值的其他问题是不帮助我。我的插值给出了我指定的and和我指定的精确c1值,但在其他已知值上却是胡说八道。abc1c1

另外,我如何能够检查c1_interpolated数组中特定a和的值b?即c1(a = 0.05, b = 0.08)没有每次都调用该函数?

我将非常感谢您的帮助,因为我已经被这个问题困扰了好几天了。

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata


def f(x, a, b):
    return a*x*x + b*x + 1

end = 1.01
begin = 0
x = np.arange(begin,end,0.1)
npoints = int(1/0.1+1)

a = (np.random.uniform(0,1,npoints))
b = (np.random.uniform(0,1,npoints))
#c = np.random.uniform(0,1,npoints)

cols = 5

y = np.zeros((cols,a.size))

for i in range(cols):
        y[i] = f(x, a[i], b[i])

u, s, vh = np.linalg.svd(y, full_matrices=True)


c1 = (vh[0])
c2 = vh[1]
c3 = vh[2]

sample  = 8
input_arr = list(zip(a[:sample], b[:sample]))

A= np.linspace(min(a[:sample]), max(a[:sample]))
B = np.linspace(min(b[:sample]), max(b[:sample]))
A, B = np.meshgrid(A, B)

interp = scipy.interpolate.LinearNDInterpolator(input_arr, c1[:sample], fill_value=0)

c1_interpolated = interp(A, B)

标签: pythonarraysnumpyscipyinterpolation

解决方案


我只想在这里总结一下我的理解,因为这听起来非常令人困惑。

你有一个矩阵。您正在对其执行奇异值分解,这会返回三个数组。然后,您希望通过第三个数组进行插值,该数组对应于矩阵的右奇异向量,并且是矩阵的 Hermitian 与其自身的乘积的一组正交特征向量。甚至不问如何执行这种插值,它会给你什么?如果我们考虑矩阵的第一行,它的每个元素都是由第一个数组的第一行乘以第二个数组的第一个元素乘以第三个数组的每一列的乘积给出。如果您通过第三个数组的列进行插值,这将为您提供矩阵的第一行,其中包含更多元素。那么,为什么不立即对矩阵进行插值呢?我真的不明白你想在这里实现什么......


推荐阅读