开发者社区 问答 正文

替换为循环以提高我的python脚本的速度

我是python的新手,所以要保持柔和。我想将名为“ image”的numpy.ndarray的值映射到我存储在名为“ maps”的numpy.ndarray中的其他值。

我有以下简短的脚本可以做到这一点(在我的脚本图像中显然不只是零):

import numpy as np
import time

maps = np.arange(1024)
image = np.zeros((3800,2560))
t0 = time.time()
for ii in range(len(maps)):
    image[image == ii] = maps[ii]
print('time = ' + str(np.round(time.time()-t0,3)))

结果:

time = 6.167

它可以满足我的要求,但是在我的代码中,我需要多次,并且总而言之,它运行非常慢(通常每次调用大约需要6秒)。有没有直接的方法可以提高速度?:)我知道通常使用for循环是最糟糕的,但我想不出解决办法。

我正在使用python 3.7.6

非常感谢您的耐心和帮助。让我知道是否还有其他我忘记提及的内容可能会帮助您找到解决方案。

马库斯

编辑

似乎我的第一个示例过于笼统,因此我在这里展示的内容与我的操作更接近:

import numpy as np
import time

a=1.5
points = np.array([[-np.pi,-np.pi/a]
,[-2.0,-2/a]
,[0,0]
,[2.0,2/a]
,[np.pi,np.pi/a],])
# fit spline
spline = interp1d(points[:,0], points[:,1], kind='cubic')

colormap_values = np.linspace(-np.pi,np.pi,(2\*10), endpoint=True)
colormap = spline(colormap_values)
np.place(colormap, colormap>np.pi, np.pi)
np.place(colormap, colormap<-np.pi, -np.pi)
maps = np.floor((1023)\*colormap+np.pi)/(2\*p.pi))

im = np.random.randint(0,1023,size = (3800,2560))
image = im.astype('f')

t0 = time.time()
for ii in range(len(maps)):
    image[image == ii] = maps[ii]
print('time = ' + str(np.round(time.time()-t0,3)))

结果:

time = 6.547

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 19:10:31 374 分享 版权
1 条回答
写回答
取消 提交回答
  • 再考虑一下,对于这个特定的例子,您可以选择

    result = maps[image]
    

    更一般地,您可以使用scipy.ndimage.labelled_comprehension

    from scipy.ndimage import labeled_comprehension
    result = labeled_comprehension(
        image, None, None, maps.__getitem__, out_dtype=np.int, default=0
        ).reshape(image.shape)
    

    这在我的机器上运行时间为17ms,而原始代码为11.5s。

    注意,labelled_comprehension会忽略零个标签。如果maps [0]!= 0,则可能需要增加原始数组的每个元素并相应地调整maps。

    回答来源:stackoverflow

    2020-03-24 19:10:41
    赞同 展开评论
问答分类:
问答标签:
问答地址: