在将数据传递给插值路由之前存储数据

2024-04-20 08:38:11 发布

您现在位置:Python中文网/ 问答频道 /正文

首先我要道歉,因为我对python(这里是Fortran的家伙)完全陌生,而且一直在快速学习。因此,在阅读了我目前的困境之后,我的知识中可能有一些非常明显的漏洞。你知道吗

我有一些需要写入文件的数据,然后可以通过插值算法读取。目前,这种插值算法很可能是SciPi的矩形二元样条。虽然X和Y的间隔不一样,但它们是有规律的,所以这似乎是理想的。你知道吗

数据通常是

X1,Y1,F(X1,Y1)

X1,Y2,F(X1,Y2)

X1,Y3,F(X1,Y3)

X2,Y1,F(X2,Y1)

X2,Y2,F(X2,Y2)

X2,Y3,F(X2,Y3)

等等。。。你知道吗

在这种情况下,F(X,Y)不是一个显式的数学函数,而是X,Y处物理量的数据点

数据是从我基本上无法控制的数据源读取的,使用

 data_array = np.loadtxt(Path/DataFile, dtype = Float, delimiter = ";", usecols = #) 

在这种情况下,可以想象有几个不同的列具有不同的数据,但它们都依赖于X和Y。有一个单独的文件,其中包含有关X和Y数量的范围和步长的信息,我读入并存储在数组中。至少,我相当肯定它是一个数组而不是一个列表,因为我在某个地方读到np.loadtxt文件以及np.genfromtxt文件两者都生成numpy数组而不是普通的python列表。你知道吗

对于如何使用简单的插值例程将这些数据最佳地存储到另一台机器上,我已经尝试过各种各样的方法,但是我可以提供一些建议。我第一次想到

ArrayExample = np.Empty(xRange,yRange) 
For n in (xRange) 
    For m in (yRange) 
        ArrayExample[n,m] = F(X,Y)

但是,这对保留与数组中的值相关联的实际数量X或Y没有任何作用,这些是插值所必需的,并且对于绘图来说绝对是必需的。你知道吗

所以我突然想到,既然我已经得到了X和Y的值,我可以很容易地从中读出,我可以做如下的事情。其中xvalues和yvalues是保存实际X和Y值的数组。你知道吗

ArrayExample = np.Empty(xRange,yRange,1) 
For n in (xRange) 
    For m in (yRange) 
        ArrayExample[n,m,1] = (xvalues[n],yvalues[m],F(X,Y))

之后,我想到将ArrayExample保存为pickle文件以移动到任何位置,然后在另一端使用pickle引入。你知道吗

然而,一旦我有了它,我真的不知道如何让矩形二元样条线来获取数据。我试过阅读scipy网站上的文档并在google上搜索,但到目前为止,我发现的一切都毫无帮助。如果有人有任何好的例子,如何使用它挂在各地,这将是非常有帮助的。你知道吗

如果您有任何建议、想法或批评,我们将不胜感激。你知道吗

谢谢!你知道吗


Tags: 文件数据infornp数组插值x1
1条回答
网友
1楼 · 发布于 2024-04-20 08:38:11

我早就看到了,希望有比我了解得多的人回答。 希望这能给你指明正确的方向

要使用RectBivariateSpline类,需要将x和y作为一维数组,将z值作为二维数组(len(x),len(y))

Numpy需要任何特定的数组索引都是整数,而不是浮点数。需要将x和y坐标转换为整数索引,以便将z数据放入数组中。你知道吗

import numpy as np
from scipy import interpolate

# Generate x and y arrays
x = np.linspace(45., 70., 70)
y = np.linspace(125/7, 59.876, 29)

# I don't know what your data looks like. Generate a list of dictionary records
data = []

for _x in x:
    for _y in y:
        data.append({'x': _x, 'y': _y, 'z': _x * _x - _y*_y/_x})

data[:100:10]
Out[4]: 
[{'x': 45.0, 'y': 17.857142857142858, 'z': 2017.9138321995465},
 {'x': 45.0, 'y': 32.86387755102041, 'z': 2000.9992344958118},
 {'x': 45.0, 'y': 47.870612244897956, 'z': 1974.075655184414},
 {'x': 45.36231884057971, 'y': 19.357816326530614, 'z': 2049.4792585649284},
 {'x': 45.36231884057971, 'y': 34.364551020408165, 'z': 2031.7068577153198},
 {'x': 45.36231884057971, 'y': 49.37128571428571, 'z': 2004.0054192006007},
 {'x': 45.72463768115942, 'y': 20.858489795918366, 'z': 2081.227345221296},
 {'x': 45.72463768115942, 'y': 35.86522448979592, 'z': 2062.610735570439},
 {'x': 45.72463768115942, 'y': 50.87195918367347, 'z': 2034.1437652565721},
 {'x': 46.08695652173913, 'y': 22.359163265306123, 'z': 2113.159976357177}]

def indexer(v):
    """ Returns a function to index into the array v by value.
        int( result + 0.5 ) to avoid any not quite equal with floats.
    """
    v_lo = v.min()
    v_range = v.max()-v_lo
    n = len(v)-1

    def func( x ):
        """ Returns an index from x. """
        return int(n*(x-v_lo)/v_range+0.5)
    return func

x_index = indexer(x)  # Function to index into the x values 
y_index = indexer(y)  # Function to index into the y values

z = np.empty((len(x), len(y)))

for rec in data:
    ix_x = x_index(rec['x'])  # Map the x value to an index
    ix_y = y_index(rec['y'])  # Map the y value to an index
    z[ix_x, ix_y] = rec['z']  # Place the z value at ix_x, ix_y

inter = interpolate.RectBivariateSpline( x, y, z)

inter(45.3, 18)  # Out[6]: array([[2044.93768211]])

inter(np.arange(45., 70.), 18)
Out[7]: 
   array([[2017.8       ], [2108.95652174], [2202.10638298], [2297.25      ],
          [2394.3877551 ], [2493.52      ], [2594.64705882], [2697.76923077],
          [2802.88679245], [2910.        ], [3019.10909091], [3130.21428571],
          [3243.31578947], [3358.4137931 ], [3475.50847458], [3594.6       ],
          [3715.68852459], [3838.77419355], [3963.85714286], [4090.9375    ],
          [4220.01538462], [4351.09090909], [4484.1641791 ], [4619.23529412],
          [4756.30434783]])

希望至少有一些建议/想法。你知道吗

相关问题 更多 >