用 Python 中的倒数替换每个非零元素
Replacing each non-zero element with the inverse of it in Python
我想用它的倒数替换 R4_mod
的每个非零元素。附上所需的输出。
import numpy as np
R4_mod=np.array([[0.00000000e+00, 1.96129124e+10, 0.00000000e+00, 1.88618492e+10,
0.00000000e+00],
[6.94076420e+09, 0.00000000e+00, 1.11642674e+09, 0.00000000e+00,
1.73640817e+10],
[0.00000000e+00, 1.96129124e+10, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00],
[6.94076420e+09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
1.73640817e+10],
[0.00000000e+00, 1.96129124e+10, 0.00000000e+00, 1.88618492e+10,
0.00000000e+00]])
期望的输出是
array([[0.00000000e+00, 1/1.96129124e+10, 0.00000000e+00, 1/1.88618492e+10,
0.00000000e+00],
[1/6.94076420e+09, 0.00000000e+00, 1/1.11642674e+09, 1/0.00000000e+00,
1.73640817e+10],
[0.00000000e+00, 1/1.96129124e+10, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00],
[1/6.94076420e+09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
1/1.73640817e+10],
[0.00000000e+00, 1/1.96129124e+10, 0.00000000e+00, 1/1.88618492e+10,
0.00000000e+00]])
如评论中所述,如果您指定where
参数,np.divide
可以帮助您。像这样:
np.divide(1, R4_mod, where=R4_mod!=0, out=R4_mod)
之后,R4_mod 将包含除法的结果。
就时间和 space 复杂性而言,这种方法应该优于
R4_mod[R4_mod != 0] = 1 / R4_mod[R4_mod != 0]
有效但创建了一个 in-memory 位数组 (R4_mod != 0
) 两次并且没有完全利用 numpy。
我们可以创建一个布尔掩码数组,显示数组包含 non_zero 值的位置,如:
mask = R4_mod != 0
# [[False True False True False]
# [ True False True False True]
# [False True False False False]
# [ True False False False True]
# [False True False True False]]
然后我们可以对掩码的 True 值进行 just 操作:
Trues = R4_mod[mask]
# [1.96129124e+10 1.88618492e+10 6.94076420e+09
# 1.11642674e+09 1.73640817e+10 1.96129124e+10
# 6.94076420e+09 1.73640817e+10 1.96129124e+10
# 1.88618492e+10]
masked_work = 1 / Trues
# [5.0986818255508041e-11 5.3017071093962513e-11 1.4407635401300624e-10
# 8.9571484108307902e-10 5.7590145985088284e-11 5.0986818255508041e-11
# 1.4407635401300624e-10 5.7590145985088284e-11 5.0986818255508041e-11
# 5.3017071093962513e-11]
现在,通过使用掩码数组将计算值应用于主数组,我们得到结果:
R4_mod[mask] = masked_work
所有这些步骤都可以在一行中完成:
R4_mod[R4_mod != 0] = 1 / R4_mod[R4_mod != 0]
必须注意,此解决方案会将原始数组更改为结果数组。如果您需要原始数组,则必须在主数组的副本上执行这些步骤。
我想用它的倒数替换 R4_mod
的每个非零元素。附上所需的输出。
import numpy as np
R4_mod=np.array([[0.00000000e+00, 1.96129124e+10, 0.00000000e+00, 1.88618492e+10,
0.00000000e+00],
[6.94076420e+09, 0.00000000e+00, 1.11642674e+09, 0.00000000e+00,
1.73640817e+10],
[0.00000000e+00, 1.96129124e+10, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00],
[6.94076420e+09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
1.73640817e+10],
[0.00000000e+00, 1.96129124e+10, 0.00000000e+00, 1.88618492e+10,
0.00000000e+00]])
期望的输出是
array([[0.00000000e+00, 1/1.96129124e+10, 0.00000000e+00, 1/1.88618492e+10,
0.00000000e+00],
[1/6.94076420e+09, 0.00000000e+00, 1/1.11642674e+09, 1/0.00000000e+00,
1.73640817e+10],
[0.00000000e+00, 1/1.96129124e+10, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00],
[1/6.94076420e+09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
1/1.73640817e+10],
[0.00000000e+00, 1/1.96129124e+10, 0.00000000e+00, 1/1.88618492e+10,
0.00000000e+00]])
如评论中所述,如果您指定where
参数,np.divide
可以帮助您。像这样:
np.divide(1, R4_mod, where=R4_mod!=0, out=R4_mod)
之后,R4_mod 将包含除法的结果。 就时间和 space 复杂性而言,这种方法应该优于
R4_mod[R4_mod != 0] = 1 / R4_mod[R4_mod != 0]
有效但创建了一个 in-memory 位数组 (R4_mod != 0
) 两次并且没有完全利用 numpy。
我们可以创建一个布尔掩码数组,显示数组包含 non_zero 值的位置,如:
mask = R4_mod != 0
# [[False True False True False]
# [ True False True False True]
# [False True False False False]
# [ True False False False True]
# [False True False True False]]
然后我们可以对掩码的 True 值进行 just 操作:
Trues = R4_mod[mask]
# [1.96129124e+10 1.88618492e+10 6.94076420e+09
# 1.11642674e+09 1.73640817e+10 1.96129124e+10
# 6.94076420e+09 1.73640817e+10 1.96129124e+10
# 1.88618492e+10]
masked_work = 1 / Trues
# [5.0986818255508041e-11 5.3017071093962513e-11 1.4407635401300624e-10
# 8.9571484108307902e-10 5.7590145985088284e-11 5.0986818255508041e-11
# 1.4407635401300624e-10 5.7590145985088284e-11 5.0986818255508041e-11
# 5.3017071093962513e-11]
现在,通过使用掩码数组将计算值应用于主数组,我们得到结果:
R4_mod[mask] = masked_work
所有这些步骤都可以在一行中完成:
R4_mod[R4_mod != 0] = 1 / R4_mod[R4_mod != 0]
必须注意,此解决方案会将原始数组更改为结果数组。如果您需要原始数组,则必须在主数组的副本上执行这些步骤。