gpt4 book ai didi

python - NumPy:3D 数组的 1D 插值

转载 作者:行者123 更新时间:2023-12-01 05:52:00 24 4
gpt4 key购买 nike

我对 NumPy 还很陌生。有人知道如何使这段代码(尤其是嵌套循环)更加紧凑/高效吗?顺便说一句,dist 和 data 是三维 numpy 数组。

def interpolate_to_distance(self,distance):

interpolated_data=np.ndarray(self.dist.shape[1:])
for j in range(interpolated_data.shape[1]):
for i in range(interpolated_data.shape[0]):
interpolated_data[i,j]=np.interp(
distance,self.dist[:,i,j],self.data[:,i,j])

return(interpolated_data)

谢谢!

最佳答案

好吧,我会用这个:

def interpolate_to_distance(self, distance):
dshape = self.dist.shape
dist = self.dist.T.reshape(-1, dshape[-1])
data = self.data.T.reshape(-1, dshape[-1])
intdata = np.array([np.interp(distance, di, da)
for di, da in zip(dist, data)])
return intdata.reshape(dshape[0:2]).T

它至少删除了一个循环(以及那些嵌套索引),但它并不比原来快很多,根据 IPython 中的 %timeit 快约 20%。另一方面,有很多(最终可能是不必要的)转换和 reshape 正在进行。

郑重声明,我将其包装在一个虚拟类中,并用随机数填充一些 3 x 3 x 3 数组进行测试:

import numpy as np

class TestClass(object):
def interpolate_to_distance(self, distance):
dshape = self.dist.shape
dist = self.dist.T.reshape(-1, dshape[-1])
data = self.data.T.reshape(-1, dshape[-1])
intdata = np.array([np.interp(distance, di, da)
for di, da in zip(dist, data)])
return intdata.reshape(dshape[0:2]).T

def interpolate_to_distance_old(self, distance):
interpolated_data=np.ndarray(self.dist.shape[1:])
for j in range(interpolated_data.shape[1]):
for i in range(interpolated_data.shape[0]):
interpolated_data[i,j]=np.interp(
distance,self.dist[:,i,j],self.data[:,i,j])
return(interpolated_data)

if __name__ == '__main__':
testobj = TestClass()

testobj.dist = np.random.randn(3, 3, 3)
testobj.data = np.random.randn(3, 3, 3)

distance = 0
print 'Old:\n', testobj.interpolate_to_distance_old(distance)
print 'New:\n', testobj.interpolate_to_distance(distance)

哪个打印(对于我的特定随机数集):

Old:
[[-0.59557042 -0.42706077 0.94629049]
[ 0.55509032 -0.67808257 -0.74214045]
[ 1.03779189 -1.17605275 0.00317679]]
New:
[[-0.59557042 -0.42706077 0.94629049]
[ 0.55509032 -0.67808257 -0.74214045]
[ 1.03779189 -1.17605275 0.00317679]]

我也尝试过np.vectorize(np.interp)但无法让它工作。我怀疑如果它确实有效的话,速度会快得多。

我也无法让 np.fromfunction 工作,因为它将 (2) 3 x 3(在本例中)索引数组传递给 np.interp ,与从 np.mgrid 获得的数组相同。

另一个注意事项:根据 np.interp 的文档,

np.interp does not check that the x-coordinate sequence xp is increasing. If xp is not increasing, the results are nonsense. A simple check for increasingness is::

np.all(np.diff(xp) > 0)

显然,我的随机数违反了“总是增加”的规则,但你必须更加小心。

关于python - NumPy:3D 数组的 1D 插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924047/

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