Python请建议使用isin来更快地替代此代码

2024-07-07 07:04:03 发布

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

我写了一个程序,在天文图像中寻找彗星,但在一个区域运行缓慢。我已经通过尽可能使用numpy和cupy优化了它的速度

我可以将速度问题归结为一个操作:

t1=np.isin(thirdsplit,file3new)

thirdsplitfile3new都是带有浮点值的numpy数组。它们的大小可以是不同的,但通常两者的大小都可能是600 x 600

上一行比较了两个数组中的每个位置,并查看另一个数组中的对应位置是否相同。如果是这样,则True返回到结果为相同形状的t1数组中的该位置

乙二醇

thirdsplit[100,100] = 2.80000
file3new[100,100] = 2.8000

所以 t1[100,100]将返回True

有没有办法重写这句话

t1=np.isin(thirdsplit,file3new)

让它跑得更快

为了记录在案,我搜索了其他答案。我发现了一个类似的问题,但使用了熊猫,但我的程序中没有使用熊猫


Tags: 图像程序numpytrue区域np数组速度
1条回答
网友
1楼 · 发布于 2024-07-07 07:04:03

isclose广播应该有效,浮动应该更准确:

In [112]: x = np.arange(9.).reshape(3,3); y = np.array([1.,5.])
In [113]: np.isclose(x[:,:,None],y)
Out[113]: 
array([[[False, False],
        [ True, False],
        [False, False]],

       [[False, False],
        [False, False],
        [False,  True]],

       [[False, False],
        [False, False],
        [False, False]]])
In [114]: _.any(axis=-1)
Out[114]: 
array([[False,  True, False],
       [False, False,  True],
       [False, False, False]])

与之相比:

In [115]: np.isin(x,y)
Out[115]: 
array([[False,  True, False],
       [False, False,  True],
       [False, False, False]])

编辑

一个例子,其中isclose得到了正确的结果-这是由于它处理浮动的方式

In [117]: x = np.arange(.1,1,.1).reshape(3,3); y = np.array([.3,.7])
In [118]: x
Out[118]: 
array([[0.1, 0.2, 0.3],
       [0.4, 0.5, 0.6],
       [0.7, 0.8, 0.9]])
In [119]: x.tolist()
Out[119]: 
[[0.1, 0.2, 0.30000000000000004],
 [0.4, 0.5, 0.6],
 [0.7000000000000001, 0.8, 0.9]]

比较:

In [121]: np.isin(x,y)
Out[121]: 
array([[False, False, False],
       [False, False, False],
       [False, False, False]])
In [122]: np.isclose(x[:,:,None],y).any(axis=-1)
Out[122]: 
array([[False, False,  True],
       [False, False, False],
       [ True, False, False]])

isin使用==测试,并且可能由于浮点精度而失败

相关问题 更多 >