[英]Efficient colorization of numpy matrix by value?
我有一個 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)
然后它將采用 rgb 組件的 3 元組並在其上執行 PIL putdata 並創建一個 PNG。
我需要多次這樣做,而且這種貧民窟方法很慢,而且着色非常難看。
我的問題是這樣的:
我可以應用一系列矩陣運算來生成包含原始 RGB 值的彩色矩陣嗎?
這實際上包含兩個問題:
編輯:澄清 - 我希望將其另存為 PNG,而不僅僅是實時查看。 原因是其中很多都是在無頭機器上執行的,然后我事后檢查。
當前算法的輸出看起來很糟糕:
matplotlib 具有imshow功能,您可以開箱即用。
您所做的通常是通過“矢量化”完成的。 您定義一個函數並讓 numpy 進行迭代:
vec = np.vectorize(val_to_rgb)
rgb_data = vec(data)
我對 PIL 不是很熟悉,但我猜測它會吞下一個形狀的 numpy 數組(rows, cols, 3)
並將其轉換為圖像。 所以你想重寫你的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
函數,請發布您的代碼,我很樂意val_to_rgb
一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.