我正在尝试从头创建一个图像数组。 我让代码运行,但运行大约需要30秒。 我觉得使用numpy本机函数可以更快。 我该怎么做
import cv2
import numpy as np
import time
volumes = np.random.randint(low=0, high=200, size=10000)
print(volumes)
image_heigh = 128
image_width = 256
image_channel = 3
show_img = False
def nomralized(data, data_min, data_max, maximum_value):
nomamized_data = maximum_value * ((data - data_min) / (data_max - data_min))
return nomamized_data
start_time = time.time()
for ii in range(len(volumes)-image_width):
# ===================== part to optimize start
final_image = np.zeros((image_heigh, image_width, image_channel))
start = ii
end = ii + image_width
current_vols = volumes[start:end]
# nomalize data
vol_min = 0
vol_max = np.max(current_vols)
vol_norm = nomralized(data=current_vols,
data_min=vol_min,
data_max=vol_max,
maximum_value=image_heigh)
for xxx in range(image_width):
final_image[:int(vol_norm[xxx]), xxx, :] = 1
# ===================== part to optimize end
if show_img:
image = np.float32(final_image)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow("ok", image)
cv2.waitKey(27)
print("total running time: ", (time.time() - start_time))
如何加快图像阵列的创建速度? 我需要每一个时间步创建一个映像,因为我想模拟每一个新时间步都会出现的实时数据流
这就是为什么我只想优化代码的这一部分:
for xxx in range(image_width):
final_image[:int(vol_norm[xxx]), xxx, :] = 1
我该怎么做
首先是最简单的优化,然后是:
np.arange(...)
进行比较,而不是内部循环李>所有这些优化都提供了巨大的加速(
10x
倍),我的运行时间是2.6 sec
,而不是以前的27 sec
另外一个我没有做的非常有用的优化是,当当前窗口中的整个数据的最大/最小值没有改变时,您不需要重新计算以前的图像像素。只有在“最大/最小”更改的情况下,才需要重新计算以前的图像数据。我预计,您的真实数据会像外汇或比特币价格一样逐渐变化,因此窗口内的最大/最小变化非常不常见
上面提到的优化1)-3)将在下一个代码中实现:
对于上面的代码,我只是对内环进行了一次优化,它将代码的速度提高了
2x
倍以上,以获得1.3 sec
的计时。但我也放回了3个通道加上float32,这降低了速度,最终2.8 sec
,here is the code如果不需要重新计算旧图像数据,则可以进行下一步优化
要优化的主要内容是,在每一步上都要重新计算几乎相同的整个图像,并沿宽度方向移动1个像素。相反,您需要计算整个图像一次,然后右移不是1像素而是整个图像宽度
然后在这个优化之后,运行时间是
0.08 sec
并且只为显示动画而进行1像素步进,而不是为了计算图像数据,如果需要速度,图像数据应该只计算一次
我还使用您的数据创建了动画图像:
如果要创建相同的动画,只需在上面的脚本末尾附加下一段代码:
我还实现了实时实时流数据渲染/可视化的模拟
live_stream()
生成器在随机时间点吐出随机数量的数据,这是为了模拟数据生成过程李>stream_fetcher()
侦听实时流并将接收到的所有数据记录到python队列q0
,此获取程序在一个线程中运行李>renderer()
获取由fetcher记录的数据,并通过数学公式和规范化过程将其渲染为图像,它渲染尽可能多的可用数据,从而生成具有不同宽度的图像,渲染的图像保存到另一个队列q1
李>visualizer()
通过获取尽可能多的渲染图像来可视化渲染数据李>所有函数都在单独的线程中运行,不会阻塞整个进程。另外,如果任何线程的工作速度变慢,那么它会跳过一些数据以赶上当前的实时数据,因此每个队列不会溢出
另外,您可能会看到可视化的过程是不稳定的,这不是因为函数有点慢,而是因为实时流在每个时间步中吐出不同数量的数据,这就是实时数据通常的行为方式
在下一段代码中,我还做了前面提到的额外优化,如果min/max没有改变,就不会重新计算图像
上面的实时流程模拟被渲染成
result.png
,我在下面显示:我还决定改进可视化,使用更高级的
matplotlib
而不是cv2
来显示轴并进行实时绘图。可视化图像如下所示:接下来是与上面最后一幅图像相对应的基于matplotlib的代码:
然后我决定玩一点,用RGB调色板着色最后一个图像,峰值越高,越是红色,如果它在中间越高,那么它就越绿,如果它足够低,那么它就更蓝了。下面的结果图像是由this coloring code实现的:
在this code的帮助下,下面是另一个单色动画,线条样式而不是条形样式:
相关问题 更多 >
编程相关推荐