gpt4 book ai didi

python - 用 Pandas 计算局部导数

转载 作者:行者123 更新时间:2023-12-04 09:43:17 24 4
gpt4 key购买 nike

A 有一个像下面这样的 CSV,它由三列组成,ix , iyiz , 表示变量 u' 所在的点 (x,y,z)被计算。原始 CSV ( link ) 包含 128^3 行,描述了 ix, iy 的所有可能组合iz :

i,ix,iz,iy,u'
0,1,1,1,-0.8696748576752853
1,1,1,2,2.3557976585107454
2,1,1,3,0.47209618683697663
3,1,1,4,-1.930481713597933
4,1,1,5,-1.7868247414530511
5,1,1,6,-0.5603642778861779
6,1,1,7,0.24540750240253573
7,1,1,8,0.5505270314521304
8,1,1,9,-0.1954277406567968
9,1,1,10,-1.3521265193776344

我想取 u'的导数关于 iy ,换句话说,计算 $\frac{u(x,y+1,z) - u(x,y,z}{dy}$。在我的第一次尝试中,我尝试了这样的事情(其中 dy = 8.68)
dudy=[];
for y in np.arange(1,128):
for x in np.arange(1,129):
for z in np.arange(1,129):
dev= (df[(df["ix"] == x) & (df["iy"] == y+1) & (df["iz"] == z)]["u'"].values -
df[(df["ix"] == x) & (df["iy"] == y) & (df["iz"] == z)]["u'"].values)/dy
dudy.append(dev)

换句话说,对于一些固定值 iy ,我找到了 ix的所有组合和 iz , 以及当 iy+1 时的所有组合,然后执行商。结果对于几行来说似乎是正确的,但是对于整个数据(128^3 行),评估代码需要花费荒谬的时间。我猜这是因为在计算商之前,代码搜索了 ix 的所有组合。和 iz ,出于某种原因,这似乎不太聪明。

我该如何改进?还有另一种方法来评估这种操作吗?内置函数?

最佳答案

您可以按 ix,iz,iy 排序(按此顺序)并使用 diff 创建派生列 der_y :

df.sort_values(['ix','iz','iy'], axis=0, ascending=True, inplace=True, kind='quicksort', na_position='first')
dy=1
df['der_y'] = df["u'"].diff(periods=-1)/-dy
#you will need to replace when `iy==128` with your desired output (probably NaN)
df.loc[df['iy']==128,'der_y'] = None

此代码的输出:
   i  ix  iz  iy        u'     der_y
0 0 1 1 1 -0.869675 3.225473
1 1 1 1 2 2.355798 -1.883701
2 2 1 1 3 0.472096 -2.402578
3 3 1 1 4 -1.930482 0.143657
4 4 1 1 5 -1.786825 1.226460
5 5 1 1 6 -0.560364 0.805772
6 6 1 1 7 0.245408 0.305120
7 7 1 1 8 0.550527 -0.745955
8 8 1 1 9 -0.195428 -1.156699
9 9 1 1 10 -1.352127 NaN

问题中提供的 for 循环的输出:
[[ 3.22547252]
[-1.88370147]
[-2.4025779 ]
[ 0.14365697]
[ 1.22646046]
[ 0.80577178]
[ 0.30511953]
[-0.74595477]
[-1.15669878]]

关于python - 用 Pandas 计算局部导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62238686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com