Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有效地按数据帧行插入数据?_Python_Python 3.x_Pandas - Fatal编程技术网

Python 如何有效地按数据帧行插入数据?

Python 如何有效地按数据帧行插入数据?,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有几千次“观察”。每次观测包括位置(x,y)和传感器读数(z),见下面的示例 我希望将双线性曲面拟合到x、y和z数据。我目前正在使用以下代码段执行此操作: 我当前的方法是循环遍历数据帧的行。(这对于1000次观测非常有效,但对于较大的数据集不可用。) 如果没有更有效的方法,我会感到惊讶。 有没有办法对线性插值进行矢量化 我把代码也生成虚拟条目。 谢谢通常不建议像这样在数据帧上循环。相反,您应该选择尽可能多地尝试和矢量化代码 首先,我们为您的输入创建一个数组 x_vals=df2[['x1'

我有几千次“观察”。每次观测包括位置(x,y)和传感器读数(z),见下面的示例

我希望将双线性曲面拟合到x、y和z数据。我目前正在使用以下代码段执行此操作:

我当前的方法是循环遍历数据帧的行。(这对于1000次观测非常有效,但对于较大的数据集不可用。)

如果没有更有效的方法,我会感到惊讶。 有没有办法对线性插值进行矢量化

我把代码也生成虚拟条目。
谢谢

通常不建议像这样在数据帧上循环。相反,您应该选择尽可能多地尝试和矢量化代码

首先,我们为您的输入创建一个数组

x_vals=df2[['x1'、'x2'、'x3'、'x4'、'x5']]值
y_vals=df2[[y1'、'y2'、'y3'、'y4'、'y5']]值
z_vals=df2[['z1'、'z2'、'z3'、'z4'、'z5']]值
接下来,我们需要创建一个处理向量输入的bi2Dlinter函数,这涉及到更改linspace/meshgrid以用于数组,以及更改最小二乘函数。通常,scipy.linalg函数在数组上工作,但据我所知,.lstsq方法不工作。相反,我们可以使用.SVD在阵列上复制相同的功能

def create_范围(开始、停止、N、端点=真):
如果端点==1:
除数=N-1
其他:
除数=N
步数=(1.0/除数)*(停止-启动)
返回步骤[:,无]*np.arange(N)+开始[:,无]
def linspace_nd(x,y,gridrez):
a1=创建_范围(x.min(轴=1)、x.max(轴=1)、N=gridrez、端点=True)
a2=创建_范围(y.min(轴=1)、y.max(轴=1)、N=gridrez、端点=True)
out_shp=a1.shape+(a2.shape[1],)
Xout=np.广播到(a1[:,无,:],输出)
Yout=np.广播到(a2[:,:,无],输出)
返回Xout,Yout
def堆叠lstsq(L、b、rcond=1e-10):
"""
通过奇异值的奇异值分解最小二乘法求解Lx=b
L是形状(…,M,N)的数组,b是形状(…,M)。
返回形状为(…,N)的x
"""
u、 s,v=np.linalg.svd(L,全矩阵=False)
s_max=s.max(轴=-1,keepdims=True)
s_最小值=rcond*s_最大值
inv_s=np.类零
库存量[s>=s\u最小值]=1/s[s>=s\u最小值]
x=np.einsum('…ji,…j->…i',v,
inv_s*np.einsum(“…ji,…j->…i',u,b.conj()))
返回np.conj(x,x)
def矢量化指针(x、y、z、gridrez):
十、 Y=linspace\u nd(X\u vals,Y\u vals,gridrez)
A=np.stack((x_vals,y_vals,np.one_like(z_vals)),轴=2)
C=堆叠的lstsq(A,z)
n_bcast=C.shape[0]
返回C.T[0]。重塑((n\u-bcast,1,1))*X+C.T[1]。重塑((n\u-bcast,1,1))*Y+C.T[2]。重塑((n\u-bcast,1,1))
在对n=10000行的数据进行测试后,矢量化函数的速度明显加快

%%timeit
ZZ=[]
对于索引,df2.iterrows()中的行:
x=行['x1']、行['x2']、行['x3']、行['x4']、行['x5']
y=行['y1'],行['y2'],行['y3'],行['y4'],行['y5']
z=行['z1'],行['z2'],行['z3'],行['z4'],行['z5']
追加((bi2Dlinter(x,y,z,gridrez)))
df2['ZZ']=ZZ
输出:每个回路5.52 s±17.4 ms(7次运行的平均值±标准偏差,每个回路1次)
%%时间
res=矢量化的指针(x值、y值、z值、gridrez)
输出:每个回路74.6 ms±159µs(7次运行的平均值±标准偏差,每个10个回路)
您应该仔细注意这个矢量化函数中发生了什么,并熟悉numpy中的广播。我不能将前三个函数归功于我,相反,我将从stack overflow链接它们的答案以供您理解


太好了!谢谢,这个答案让我高兴极了。我添加了一个显示速度的图表,我肯定会深入研究矢量化。很好的一个,对于更高的阶数,你也可以使用numexpr来创建范围函数,如所附的矢量化NumPy linspace答案所示。哇,你不仅让我开心,你还制定了一个很好的课程:矢量化、广播、numexpr,einsum等。我发布了一个关于这个解决方案的后续问题,因为当增加行数时,这两种拟合会产生不同的结果。我只检查了1000行数据的结果,它们是匹配的。我想我可以一步一步地通过这个函数来检查它的运行情况
def bi2Dlinter(xdata, ydata, zdata, gridrez):
    X,Y = np.meshgrid(
             np.linspace(min(x), max(x), endpoint=True, num=gridrez),
             np.linspace(min(y), max(y), endpoint=True, num=gridrez))  
    A = np.c_[xdata, ydata, np.ones(len(zdata))]
    C,_,_,_ = scipy.linalg.lstsq(A, zdata)
    Z = C[0]*X + C[1]*Y + C[2]
    return Z
ZZ = []
for index, row in df2.iterrows():
    x=row['x1'], row['x2'], row['x3'], row['x4'], row['x5']
    y=row['y1'], row['y2'], row['y3'], row['y4'], row['y5']
    z=row['z1'], row['z2'], row['z3'], row['z4'], row['z5']
    ZZ.append(np.median(bi2Dlinter(x,y,z,gridrez)))
df2['ZZ']=ZZ