[英]Applying tuple operations element-wise to a numpy array of tuples
我正在使用二維數組的“像素”(rgb int元組),並且我需要一種有效的方法來對每個元素進行一些numpy操作。 具體來說,我正在嘗試在目標顏色的幾種顏色陰影內找到像素,以便稍后使用numpy.nonzero進行隔離
在這種情況下,使用For循環需要數十秒,因此我希望逐個元素地應用numpy操作以達到相同的結果。
我正在申請
元組減法:
pixel_diff = numpy.subtract( pixel_a, pixel_b)
元組絕對值:
pixel_abs = numpy.abs( pixel_diff )
元組比較:
pixel_bool = pixel_abs < int_tolerance
元組全部():
is_similar = numpy.all(pixel_bool)
嘗試將任何這些操作盲目地應用於我的陣列會導致無效的升級錯誤,因此我認為必須有一種適當的方法來執行此操作。
import numpy as np
#create a RGB array of 1000x1000x3 and separate into colors
R, G, B = np.random.randint(0, 255, size = (1000, 1000, 3))
#find all pixels less than 100, 100, 100
np.logical_and((R<100), (G<100), (B<100))
您可以修改最后一行以適合您的顏色需求。 照原樣,最后一行在單個內核上花費約1.5 ms。
您可以轉換為等效的非結構化視圖 (無需花費任何額外成本來復制基礎數據):
my_3dview_of_ints = my_2d_of_3tuples.view(dtype=int)
其中my_2d_of_3tuples
是您當前的結構化數組(元組數組)
然后,您可以在此視圖上執行常規的numpy數組操作,而不會遇到任何類型錯誤。
例如,如果您的數組如下所示:
[[(207, 27, 185) ( 90, 197, 52) ( 58, 153, 145) (239, 42, 39)]
[(218, 23, 195) (226, 92, 170) ( 21, 114, 190) (192, 145, 48)]]
然后,如上創建的視圖將如下所示:
[[[207 27 185]
[ 90 197 52]
[ 58 153 145]
[239 42 39]]
[[218 23 195]
[226 92 170]
[ 21 114 190]
[192 145 48]]]
例如:
pixel_a = my_3dview_of_ints[0,0] # pixel [207,27,185] at [0,0]
pixel_b = my_3dview_of_ints[1,1] # pixel [226,92,170] at [1,1]
pixel_diff = numpy.subtract( pixel_a, pixel_b) # Gives [-12,-65,5]
您甚至可以更改視圖中的特定元素,並且更改將自動反映在原始結構化數組中的相應位置:
my_3dview_of_ints[3,3] = pixel_a # Assign [207, 27,185] to location [3,3]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.