如何取 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)
我正在尝试取 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)