簡體   English   中英

具有多種條件的優雅 2D numpy 索引

[英]Elegant 2D numpy indexing with multiple conditions

我有一個我希望變成虛擬變量的數字數組(即,如果滿足條件,則數組為 1,否則為 0)。 但是,條件可能很多,我想知道是否有比我使用的更優雅的解決方案。

arr = np.random.randint(0, 50, size=(100, 100))

# What I'm doing

dummy = np.zeros(arr.shape)
dummy[np.where(np.logical_or.reduce((arr== 10, arr== 15, arr==16, arr==17)))] = 1

在該示例中,每個值為 10、15、16 或 17 的值都變為一個零。 對於一些虛擬變量,我有 10 多個條件,表達式可能會變得冗長,所以我正在尋找更簡潔的東西。 我試過這樣的事情,但得到了一個 ValueError。

dummy= [1 if x in [10, 15, 16, 17] else 0 for x in arr]

您可以使用np.select

arr = np.select([arr==10, arr==15,arr==16,arr==17],[1,1,1,1],0)

可讀性是在旁觀者的眼睛有點,但兩種不同的方式使用1 in ... else 0結構是使用雙for在矩陣的行為的元素循環

dummy = [[1 if x in [10, 15, 16, 17] else 0 for x in row] for row in arr]

不過,它的輸出不是np.array (矩陣),而是一個list list 另一種方式來做到這一點,其中“皮”的雙重for循環是使用np.vectorize作為

dummy_func = np.vectorize(lambda x: 1 if x in [10, 15, 16, 17] else 0)
dummy = dummy_func(arr)

或作為單線

dummy = np.vectorize(lambda x: 1 if x in [10, 15, 16, 17] else 0)(arr)

其中,可能會采用矢量化方法將數據類型保留為np.array因為這通常是更合理的選擇。 而且,即使我將它顯示為可能的單行,我仍然認為最好先定義函數,然后將其應用於兩條不同的行。

不過應該注意的是,vectorize 基本上只是一個雙for循環,因此與其他numpy函數相比,執行速度相當慢。 如果還有其他方法,我也不會感到驚訝,這可能能夠使用numpy的內置並行計算行為,但這又是可讀性(意圖)和速度之間的權衡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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