Python 3.7布尔索引使用'list'进行*警告*

时间:2019-03-15 19:55:15

标签: python-3.x numpy boolean

  • 采用非常大的列表,以使其出于多种原因无法容纳在可用内存中,请访问以下网址:A = [ 2, -3, 10, 0.2]
  • 映射其组成部分的符号:sign_A = list(map(lambda u: (abs(u)==u), A))
    您得到[True, False, True, True]
  • 在需要对abs_A = [abs(e) for e in A]进行操作的地方做一些逻辑。因此,您刷新了A,并且继续使用sign_Aabs_A。逻辑产生列表i的组件的感兴趣索引,例如kabs_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_”会出错   标量将被解释为索引。

警告间接告诉我,可能有比我的代码片段更好,更“蟒蛇般”的方式来执行此操作。我找到了相关的帖子(例如herehere),但没有建议我应该如何处理。有人吗?

4 个答案:

答案 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 的回答的指导。