簡體   English   中英

如何取 numpy 數組中所有非零條目的倒數

[英]How do I take the reciprocal of all non-zero entries in a numpy array

我試圖取一個 numpy 數組中每個非零值的倒數,但我搞砸了。 認為:

norm = np.arange(0,11)

我想要 np.array 那將是(保持零到位)

[ 0, 1, 0.5 , 0.33, 0.25, 0.2 , 0.17, 0.14, 0.12, 0.11, 0.1] 

如果我設置

mask = norm !=0 

我嘗試

1/norm[mask]

我收到了預期的結果

[1, 0.5 , 0.33, 0.25, 0.2 , 0.17, 0.14, 0.12, 0.11, 0.1] 

但是我試圖理解為什么當我嘗試以下任務時

norm[mask] = 1/norm[mask]    

我得到以下 numpy 數組。

[0,1,0,0,0,0,0,0,0,0,0]

關於為什么會這樣或如何實現所需的 np.array 的任何想法?

您確定您沒有意外更改norm的值嗎?

兩個都

mask = norm != 0
norm[mask] = 1 / norm[mask]

norm[norm != 0] = 1 / norm[norm != 0]

兩者都做你想讓他們做的事情。 我也嘗試過在左側使用mask並在右側使用norm != 0 ,就像你上面所做的那樣(為什么?)並且它工作正常。

FY 編輯:我誤讀了這個例子。 我認為原始海報以 [0, .5, .333, .25] 而不是 [0, 1, 2, 3, 4] 開頭。 海報意外地創建了一個 int64 數組而不是一個浮點數組,並且所有內容都向下舍入為零。 將其更改為np.arange(0., 11.)

另一個選項是使用numpy.reciprocal ,如此處記錄的那樣帶有一個參數where如下所示:

import numpy as np
data = np.reciprocal(data,where= data!=0)

例子:

In[1]: data = np.array([2.0,4.0,0.0])
in[2]: np.reciprocal(data,where=data!=0)
Out[9]: array([0.5 , 0.25, 0.  ])

請注意,此函數不適用於ints ,因此初始化值帶有.0后綴。 如果您不確定類型,您可以隨時使用data.astype(float64)

暫無
暫無

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

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