0

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

我可以将速度问题追溯到一项操作:

t1=np.isin(thirdsplit,file3new)

thirdsplit并且file3new都是带有浮点值的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)

让它运行得更快?

为了记录,我搜索了替代答案。我发现了一个类似的问题,但它使用了 Pandas,但我的程序中没有使用 Pandas。

4

1 回答 1

0

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使用==测试,并且可能由于浮点精度而失败。

于 2021-08-18T15:10:44.490 回答