簡體   English   中英

將元組操作按元素應用於元組的numpy數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM