如何取 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]。 Poster 不小心创建了一个 int64 数组而不是浮点数组,并且所有内容都向下舍入为零。将其更改为 np.arange(0., 11.)

另一种选择是使用 numpy.reciprocal 作为记录 here 和参数 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)