使用argmax numpython设置数组格式

2024-05-06 20:25:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用Numbers[(Numbers<=0).argmax():] = 0函数时遇到了问题,如果条件满足,它应该将它后面的所有元素都变成零,但是如果条件不满足,它会将所有数组元素变成零。如何解决此问题。如果不满足Numbers<=0条件,则不应更改数组

满足条件为-35.15610151的阵列:

Numbers = np.array([123.6,       123.6 ,       123.6,        110.3748,     111.6992976,
 102.3165566,   97.81462811 , 89.50038472 , 96.48141473 , 90.49956702,
  88.59907611 , 77.96718698,  61.51611052,  56.84088612,  55.36302309,
  54.69866681,  56.44902415 , 59.49727145,  42.12406819,  27.42276839,
  33.86711896,  32.10602877,  -35.15610151,  32.34361339 , 29.20628289])

Numbers[(Numbers<=0).argmax():] = 0

输出:

[123.6        123.6        123.6        110.3748     111.6992976
 102.3165566   97.81462811  89.50038472  96.48141473  90.49956702
  88.59907611  77.96718698  61.51611052  56.84088612  55.36302309
  54.69866681  56.44902415  59.49727145  42.12406819  27.42276839
  33.86711896  32.10602877   0.           0.           0.        ]

没有满足条件的数组,将-35.1561015变为+35.1561015:

Numbers = np.array([123.6,       123.6 ,       123.6,        110.3748,     111.6992976,
 102.3165566,   97.81462811 , 89.50038472 , 96.48141473 , 90.49956702,
  88.59907611 , 77.96718698,  61.51611052,  56.84088612,  55.36302309,
  54.69866681,  56.44902415 , 59.49727145,  42.12406819,  27.42276839,
  33.86711896,  32.10602877,  35.15610151,  32.34361339 , 29.20628289])

Numbers[(Numbers<=0).argmax():] = 0

输出:

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0.]

Tags: 函数元素np数组条件arraynumbersargmax
2条回答

只需使用if就可以了,它很好地代表了意图,并且很容易理解:

smaller_equal_zero = Numbers <= 0
if smaller_equal_zero.any():
    Numbers[smaller_equal_zero.argmax():] = 0

使用Python 3.8+,您可以在if中使用赋值表达式:

if (smaller_equal_zero := Numbers <= 0).any():
    Numbers[smaller_equal_zero.argmax():] = 0

尝试这两种方法,一种是就地分配给NumPy视图,另一种是创建一个新数组以分配给另一个变量-

#Method 1 (Inplace assignment)
Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0

或,

#Method 2 (Not inplace)
np.where(~(Numbers<=0).cumsum(dtype=bool), Numbers, 0)

或,

#As an excellent suggestion by Mad Physicist!
Numbers[np.logical_or.accumulate(Numbers >= 0)] = 0

解释-

  1. 返回[F, F, F, T, F, F, F]的bool数组可以看作是1和0的数组。执行求和运算最终将第一个T分配给后续元素

  2. 因此,这会将数组转换为[F, F, F, T, T, T, T],现在可以仅与boolean indexing一起使用,并将视图设置为0或np.where以获取原始元素,或基于使用~反转布尔值将其设置为0

  3. 这里的优点是,如果数组只是由False组成,这意味着没有元素满足条件,那么它只返回原始的Numbers本身,而不是将它们设置为0


运行测试-

  1. 具有满足条件的值
Numbers = np.array([123.6 , 123.6 ,  -123.6, 110.3748 ,  111.6992976, 102.3165566,  97.81462811])

Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0

#array([123.6, 123.6,   0. ,   0. ,   0. ,   0. ,   0. ])
  1. 没有满足条件的值
Numbers = np.array([123.6 , 123.6 ,  123.6, 110.3748 ,  111.6992976, 102.3165566,  97.81462811])

Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0

#array([123.6 , 123.6 , 123.6 , 110.3748 ,111.6992976 , 102.3165566 ,  97.81462811])

编辑:根据请求新建场景

Numbers1 = np.array([1.1, 2.2, 3.3, 4.4, 5.5])
Numbers2 = np.array([1,2,-3,4,5])

Numbers2 = np.where(~(Numbers2<=0).cumsum().astype(bool), Numbers1, 0)
Numbers2
array([1.1, 2.2, 0. , 0. , 0. ])

相关问题 更多 >