簡體   English   中英

使用 argmax 格式化數組 numpy Python

[英]Array formatting with argmax numpy Python

我在使用Numbers[(Numbers<=0).argmax():] = 0 function 時遇到問題,如果滿足條件,它應該將其后面的所有元素都變為零,但是如果條件不滿足,它會轉動所有數組元素歸零。 我該如何解決這個問題。 如果不滿足Numbers<=0條件,則數組不應更改。

在 -35.15610151 處滿足條件的數組:

Numbers = np.array([123.6,       123.6 ,       123.6,        110.3748,     111.6992976,
 102.3165566,   97.81462811 , 89.50038472 , 96.48141473 , 90.49956702,
  88.59907611 , 77.96718698,  61.51611052,  56.84088612,  55.36302309,
  54.69866681,  56.44902415 , 59.49727145,  42.12406819,  27.42276839,
  33.86711896,  32.10602877,  -35.15610151,  32.34361339 , 29.20628289])

Numbers[(Numbers<=0).argmax():] = 0

Output:

[123.6        123.6        123.6        110.3748     111.6992976
 102.3165566   97.81462811  89.50038472  96.48141473  90.49956702
  88.59907611  77.96718698  61.51611052  56.84088612  55.36302309
  54.69866681  56.44902415  59.49727145  42.12406819  27.42276839
  33.86711896  32.10602877   0.           0.           0.        ]

不滿足條件的數組,將 -35.15610151 變為 +35.15610151:

Numbers = np.array([123.6,       123.6 ,       123.6,        110.3748,     111.6992976,
 102.3165566,   97.81462811 , 89.50038472 , 96.48141473 , 90.49956702,
  88.59907611 , 77.96718698,  61.51611052,  56.84088612,  55.36302309,
  54.69866681,  56.44902415 , 59.49727145,  42.12406819,  27.42276839,
  33.86711896,  32.10602877,  35.15610151,  32.34361339 , 29.20628289])

Numbers[(Numbers<=0).argmax():] = 0

Output:

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0.]

嘗試這兩種方法,一種是對 NumPy 視圖的就地分配,另一種是創建一個新數組以分配給另一個變量 -

#Method 1 (Inplace assignment)
Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0

或者,

#Method 2 (Not inplace)
np.where(~(Numbers<=0).cumsum(dtype=bool), Numbers, 0)

或者,

#As an excellent suggestion by Mad Physicist!
Numbers[np.logical_or.accumulate(Numbers >= 0)] = 0

解釋 -

  1. 返回[F, F, F, T, F, F, F]的bool數組可以看成一個1和0的數組。 執行 cumsum 最終會將第一個 T 傳播到后續元素。

  2. 因此,這會將數組轉換為[F, F, F, T, T, T, T] ,現在可以僅使用boolean indexing並將視圖設置為 0 或np.where以獲取原始元素或 0 基於用~反轉 boolean

  3. 這里的好處是,如果你的數組只是由 False 組成,這意味着沒有元素滿足條件,它只會返回原始Numbers本身,而不是將它們設置為 0。


運行測試 -

  1. 具有滿足條件的值
Numbers = np.array([123.6 , 123.6 ,  -123.6, 110.3748 ,  111.6992976, 102.3165566,  97.81462811])

Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0

#array([123.6, 123.6,   0. ,   0. ,   0. ,   0. ,   0. ])
  1. 沒有符合條件的值
Numbers = np.array([123.6 , 123.6 ,  123.6, 110.3748 ,  111.6992976, 102.3165566,  97.81462811])

Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0

#array([123.6 , 123.6 , 123.6 , 110.3748 ,111.6992976 , 102.3165566 ,  97.81462811])

編輯:根據要求的新場景

Numbers1 = np.array([1.1, 2.2, 3.3, 4.4, 5.5])
Numbers2 = np.array([1,2,-3,4,5])

Numbers2 = np.where(~(Numbers2<=0).cumsum().astype(bool), Numbers1, 0)
Numbers2
array([1.1, 2.2, 0. , 0. , 0. ])

if就可以了,很好的表達了意圖,也很容易理解:

smaller_equal_zero = Numbers <= 0
if smaller_equal_zero.any():
    Numbers[smaller_equal_zero.argmax():] = 0

使用 Python 3.8+,您可以在if中使用賦值表達式:

if (smaller_equal_zero := Numbers <= 0).any():
    Numbers[smaller_equal_zero.argmax():] = 0

暫無
暫無

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

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