Numpy函数在使用np.where

问题描述

我的问题的简短介绍。 我想绘制一个声音文件,以numpy为单位。由于出现负数,仅执行20 * np.log10(arr)无效。 因此,我一直在考虑使用np.where()。因为np.where()ufunc的一部分,所以我只想这样做(比起括号,它更容易读,也更易读)。

我遇到了一些困难(通过对随机数进行少量测试,结果出乎意料)。所以我更新到了最新版本的numpy(以前是1.18.x,现在是1.19.1)。
我也将Spyder更新为4.1.4。

因此,我在控制台中执行了以下步骤以进行检查。 我还添加了一些步骤的注释。

In [1]: import numpy as np

In [2]: a = np.round(np.random.rand(10) * 3,0)

In [3]: a
Out[3]: array([2.,1.,2.,3.,0.,1.])

In [4]: tf = np.where(a==2,True,False)

In [5]: b = np.power(a,3,where=np.where(a==2,False))
In [6]: b
Out[6]: 
array([8.,1.42180731,8.,1.31799691,1.01436297,2.82985094,0.35036821,0.73520376])

In [7]: np.power(a,where=tf)
Out[7]: array([8.,1.])

In[8]: np.power(a,False))
Out[8]: array([8.,1.])

因此,当仅在控制台中进行计算时,它看起来不错,但是当使用变量时,原始值混乱了。

In[9]: b=np.power(a,where=tf)

In[10]: b
Out[10]: 
array([8.,0.73520376])

In[11]: np.log10(a,where=np.where(a>2,False))
Out[11]: 
array([8.,0.47712125,0.73520376])

由于结果很奇怪,我检查了a是否仍然正确

In[12]: a  # Check if a still right
Out[12]: array([2.,1.])

看起来像是。因此,我接下来尝试了np.log10()。检查会发生什么:

In[13]: np.log10(a,False))
Out[13]: 
array([2.,1.        ])

In[14]: c = np.log10(a,False))

In[15]: c
Out[15]: 
array([2.,1.        ])

使用c(log10),一切正常/看起来很好。所以我删除了b(我使用了spyder,所以从变量浏览器中删除了它)。 然后我重新创建了b

In[16]: b = np.power(a,False))

In[17]: b
Out[17]: array([8.,1.])

In[18]: b1 = np.power(a,where=tf)

In[19]: b1
Out[19]: 
array([8.00000000e+000,1.82804289e-322,8.00000000e+000,0.00000000e+000,6.52741159e-038,7.63251534e+169,1.23967276e+224])

所以我无法理解为什么会这样。我做错什么了吗? (如果是,请解释)。这是Numpy中的错误吗?

编辑:我在多台笔记本电脑上都出现过。所以我创建了一个迷你脚本,如果它在您的PC /笔记本电脑上,该怎么办?如果有问题,我会在脚本之前使用脚本,在所有机器上都使用anaconda。

a = np.round(np.random.rand(10) * 3,0)
tf = np.where(a==2,False)
b = np.power(a,False))
b1 = np.power(a,where=tf)
c = np.log10(a,False))

bits = 16
linarr = np.arange(2 ** bits) - 2 ** (bits - 1)
logarr = np.copy(linarr)
logarr = 20 * np.log10(logarr,where=np.where(linarr > 0,False))

我希望至少在logarr上我会沿以下方向array([-32768,-32767,-32766,...,... 90.3085,90.3087])有所收获,但我会得到array([1.76e-314,1.72-314,2.12e-312,90.3087])

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)