使用argmax numpython设置数组格式
我在使用使用argmax numpython设置数组格式,python,arrays,function,numpy,sorting,Python,Arrays,Function,Numpy,Sorting,我在使用Numbers[(Numbers尝试这两种方法时遇到了问题,一种是就地分配给NumPy视图,另一种是创建一个新数组来分配给另一个变量- #Method 1 (Inplace assignment) Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0 解释- 返回[F,F,F,T,F,F,F]的布尔数组可以看作是一个由1和0组成的数组。执行求和运算的结果是将第一个T按比例分配给后续元素 因此,这会将数组变成[F,F,F,T,T,T,T],现在
Numbers[(Numbers尝试这两种方法时遇到了问题,一种是就地分配给NumPy视图,另一种是创建一个新数组来分配给另一个变量-
#Method 1 (Inplace assignment)
Numbers[(Numbers<=0).cumsum(dtype=bool)] = 0
解释-
返回[F,F,F,T,F,F,F]
的布尔数组可以看作是一个由1和0组成的数组。执行求和运算的结果是将第一个T按比例分配给后续元素
因此,这会将数组变成[F,F,F,T,T,T,T]
,现在可以与布尔索引一起使用并将视图设置为0或np。其中
获取原始元素,或在使用~
反转布尔值的基础上设置为0
这里的优点是,如果数组只是由False组成,这意味着没有元素满足条件,那么它只返回原始的数字本身,而不是将它们设置为0
运行测试-
具有满足条件的值
只需使用,如果
,那么它很好地代表了意图,并且很容易理解:
smaller_equal_zero = Numbers <= 0
if smaller_equal_zero.any():
Numbers[smaller_equal_zero.argmax():] = 0
你有没有检查过(数字np.ones(3,bool).argmax()
是0,第一个True
。更有效的是,n[np.logical\u或.accumulate(n>=0)]=0
谢谢你的工作。我有没有办法实现它,这样它也可以扫描另一个数组,比如np.where(~(数字2)相同的代码不也适用吗?np.where(~)数字2为我工作。我已经编辑了我的答案,请检查。谢谢我犯了一个愚蠢的错误谢谢
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.]
#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
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. ])
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. ])
smaller_equal_zero = Numbers <= 0
if smaller_equal_zero.any():
Numbers[smaller_equal_zero.argmax():] = 0
if (smaller_equal_zero := Numbers <= 0).any():
Numbers[smaller_equal_zero.argmax():] = 0