我是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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
再考虑一下,对于这个特定的例子,您可以选择
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