这似乎是非常直截了当的,但我似乎不知道如何将-Pi和Pi之间的角度映射到0到2Pi之间。我试着使用np.select,但由于某种原因,它冻结了我的程序。我需要在这个范围内的角度,因为它们将作为训练数据的神经网络,不能输出负数。
audio = wav.read('/home/chase/Desktop/ge.wav')[1].astype(np.float32)
audio = np.mean(audio, 1)
audio /= np.max(np.abs(audio))
audio = np.array([np.fft.rfft(audio[i:i + FRAME_SIZE]) for i in range(0, len(audio) - len(audio) % FRAME_SIZE, FRAME_SIZE)])
audio /= FRAME_SIZE
audio_mag = np.abs(audio)
audio_phase = np.angle(audio)
#this line freezes the program
audio_phase = np.select(audio_phase < 0 , 2 * np.pi + audio_phase, audio_phase)我需要音频
发布于 2016-05-21 01:56:30
让我们说你有这样的角度:
>>> angles = np.linspace(-np.pi, np.pi, 10)
>>> angles
array([-3.14159265, -2.44346095, -1.74532925, -1.04719755, -0.34906585,
0.34906585, 1.04719755, 1.74532925, 2.44346095, 3.14159265])有两种可能的方法。
numpy表达式查找负值..。小于零的应该转换为正确的值。就像这样:
>>> (2*np.pi + angles) * (angles < 0) + angles*(angles > 0)
array([ 3.14159265, 3.83972435, 4.53785606, 5.23598776, 5.93411946,
0.34906585, 1.04719755, 1.74532925, 2.44346095, 3.14159265])记住,在numpy中,您可以进行逻辑测试. angles < 0是一个布尔数组。但是,1*(angles < 0)是一个数字数组,其中True值映射到1,False值映射到0。你可以把这两个概念结合起来得到你的答案。
要做到这一点,只需将2*np.pi添加到所有内容中,并接受模块。这就像找到“单位位置”,或者把一个数字转换成八进制数字等等.
>>> (angles + 2 * np.pi) % (2 * np.pi)
array([ 3.14159265, 3.83972435, 4.53785606, 5.23598776, 5.93411946,
0.34906585, 1.04719755, 1.74532925, 2.44346095, 3.14159265])我希望这能帮到你。
发布于 2016-05-21 04:01:42
下面是几种不同的方法,包括计时:
In [1]: import numpy as np; from numpy import linspace, pi
In [2]: N=10000
In [3]: %timeit x=linspace(-pi, pi, N); np.where(x<0 , 2*pi+x, x)
10000 loops, best of 3: 79.1 µs per loop
In [4]: %timeit x=linspace(-pi, pi, N); np.select(x<0 , 2*pi+x, x)
1 loops, best of 3: 354 ms per loop
In [5]: %timeit x=linspace(-pi, pi, N); x[x<0] += 2*pi
10000 loops, best of 3: 82.5 µs per loop
In [6]: %timeit x=linspace(-pi, pi, N); (x + 2*pi)*(x<0) + x*(x>=0)
10000 loops, best of 3: 149 µs per loop
In [7]: %timeit x=linspace(-pi, pi, N); (x + 2*pi)%(2*pi)
10000 loops, best of 3: 192 µs per loop我发现x[x<0] += 2*pi是最易读的,但是where(x<0, x+2*pi, x)稍微快一些。到目前为止,select表单是最慢的。
比较而言,下面是同一台机器上的普通linspace函数:
In [8]: %timeit x=linspace(-pi, pi, N)
10000 loops, best of 3: 35.9 µs per loop考虑到程序在select上失败,而不是成本更高的fft函数,您可能会遇到内存不足的情况,将数组分页到磁盘( x<0和2*pi+x都生成数组,加上原始x和select创建的返回值)。如果是这样的话,那么您可能会更好地纠正相位一帧一帧。
发布于 2018-09-25 08:46:14
-Pi和+Pi之间的角度:
>>> import numpy as np
>>> angles = np.linspace(-np.pi, np.pi, 10)移到0到2*Pi:
>>> angles_2pi = np.mod(angles, 2*np.pi)
>>> angles_2pi
array([3.14159265, 3.83972435, 4.53785606, 5.23598776, 5.93411946,
0.34906585, 1.04719755, 1.74532925, 2.44346095, 3.14159265])https://stackoverflow.com/questions/37358016
复制相似问题