A = [ 2, -3, 10, 0.2]
list(map(lambda u: (abs(u)==u), A))
[True, False, True, True]
abs_A = [abs(e) for e in A]
进行操作的地方做一些逻辑。因此,您刷新了A
,并且继续使用sign_A
和abs_A
。逻辑产生列表i
的组件的感兴趣索引,例如k
,abs_A
,...。我遇到的问题是使用三元运算符(falsevalue, truevalue)[condition]
在 A
<的 signed 分量上进行一些代数运算/ strong>,例如:
abs_A[i]*(-1, 1)[sign_A[i]] + abs_A[k]**(-1, 1)[sign_A[k]]
# equivalently, can use:
# abs_A[i]*(-1, 1)[np.bool(sign_A[i])] + abs_A[k]**(-1, 1)[np.bool(sign_A[k])]
我收到此警告:
DeprecationWarning:将来,“ np.bool_”会出错 标量将被解释为索引。
警告间接告诉我,可能有比我的代码片段更好,更“蟒蛇般”的方式来执行此操作。我找到了相关的帖子(例如here和here),但没有建议我应该如何处理。有人吗?
答案 0 :(得分:2)
使用列表,布尔索引可以正常工作:
In [21]: A = [ 2, -3, 10, 0.2]
In [22]: sign_A = list(map(lambda u: (abs(u)==u), A))
In [23]: abs_A = [abs(e) for e in A]
In [24]: i=0; k=1
In [25]: abs_A[i]*(-1, 1)[sign_A[i]] + abs_A[k]**(-1, 1)[sign_A[k]]
Out[25]: 2.3333333333333335
如果我们尝试使用numpy布尔值进行索引,则会收到警告:
In [26]: abs_A[i]*(-1, 1)[np.array(sign_A)[i]]
/usr/local/bin/ipython3:1: DeprecationWarning: In future, it will be an error for 'np.bool_' scalars to be interpreted as an index
#!/usr/bin/python3
Out[26]: 2
我们可以通过从一开始就使sign_A
数组为整数来解决此问题:
In [27]: abs_A[i]*(-1, 1)[np.array(sign_A,dtype=int)[i]]
Out[27]: 2
如果我们以数组开头:
In [28]: B = np.array(A)
符号数组-使用where
直接映射到(-1,1)空间
In [30]: sign_B = np.where(B>=0,1,-1)
In [31]: sign_B
Out[31]: array([ 1, -1, 1, 1])
abs数组:
In [32]: abs_B = np.abs(B)
重新创建的数组:
In [33]: abs_B*sign_B
Out[33]: array([ 2. , -3. , 10. , 0.2])
答案 1 :(得分:0)
为避免警告,将np.bool()
替换为int()
:
abs_A[i]*(-1, 1)[int(sign_A[i])] + ...
答案 2 :(得分:0)
一种简单的解决方案是使用语法truevalue if condition else falsevalue
代替(falsevalue, truevalue)[condition]
。
答案 3 :(得分:0)
扩展 DYZ 于 2019 年 3 月 15 日的回答:
在这种情况下,将符号函数从布尔值重新映射为整数导致使用 np.bool 触发
<块引用>DeprecationWarning: 以后,'np.bool_' 会报错 被解释为索引的标量。
改用 int()
解决了问题。
包装方法的可读性较差,但也能奏效:int(np.bool(sign_A[i]))
在更一般的 numpy 按位逻辑运算符的情况下,相同的警告是通过例如使用不等式检查作为索引来触发的:
result = X[np.less_equal(a, b)]
X
可以保存非整数类型的项目。
如果 X 包含 float
项的合适解决方案是:
result = float(X[np.less_equal(a, b)])
或者,
result = X[np.less_equal(a, b)]
return = float(result)
可以与函数定义一起使用。
后一个 return
形式是我解决今天在函数定义中触发的警告的方式。我受到了 DYZ 的回答的指导。