我有一个numpy ndarray,看起来像:
[[0, 0.25, 1, ...., 0.5, 0.23 ],
[0.3, 0.75, 1, ..., 0.5, 0.37 ],
...,
...,
[0, 0.25, 1, ...., 0.5, 0.23 ],
[0.3, 0.75, 1, ..., 0.5, 0.37 ]]
基本上每个值都在0 - 1.0
范围内我想把它想象成一个位图,目前我有一个非常慢的循环基本上这样做:
for i, row in enumerate(data):
for j, val in enumerate(row):
yield val_to_rgb(val)
然后它将采用3元组的rgb组件并在其上创建一个PIL putdata并创建一个PNG。
我需要多次这样做,这种贫民窟方法很慢,而且着色非常难看。
我的问题是:
我可以应用一系列矩阵运算,它们会产生一个包含原始RGB值的彩色矩阵吗?
这实际上包含两个问题:
编辑:澄清 - 我希望将其保存为PNG,而不仅仅是实时查看。原因是其中很多都是在无头机器上执行的,然后我会检查它。
当前算法的输出看起来非常讨厌:
答案 0 :(得分:3)
matplotlib具有imshow功能,您可以使用OOTB。
您正在做的事情通常是通过“矢量化”完成的。你定义一个函数,让numpy做迭代:
vec = np.vectorize(val_to_rgb)
rgb_data = vec(data)
答案 1 :(得分:2)
我对PIL不太熟悉,但我猜它会吞下一个形状(rows, cols, 3)
的numpy数组并将其变成图像。因此,您希望重写val_to_rgb
函数,使其适用于数组,而不是标量,并将RGB值放在形状的最后一个维度中。
例如,假设您想将您的值解释为灰度,0为黑色,1为白色。您当前采用标量输入的函数如下所示:
def val_to_rgb(val) :
return (int(val * 255),) * 3
和矢量化形式将是:
def vals_to_rgbs(vals) :
ret = np.zeros(vals.shape + (3,), dtype='uint8')
ret[...] = vals.reshape(vals.shape + (1,)) * 255
return ret
>>> vals_to_rgb(np.random.rand(10,10)).shape
(10, 10, 3)
>>> vals_to_rgb(np.random.rand(10,10)).dtype
dtype('uint8')
重塑的目的是让广播发挥其神奇作用。
认为可能会变得更复杂,所以如果您需要帮助矢量化您的特定val_to_rgb
功能,请发布您的代码,我很乐意为此拍摄。