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