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