python - Numpy 将角度范围从 (-Pi, Pi) 转换为 (0, 2*Pi)

标签 python numpy

这看起来非常简单,但我似乎无法弄清楚如何将 -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)

我需要音频

最佳答案

这里有几种不同的方法完成计时:

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<02*pi+x 生成数组,加上你有原始的 xselect 创建的返回值)。如果是这种情况,那么您最好逐帧校正相位。

关于python - Numpy 将角度范围从 (-Pi, Pi) 转换为 (0, 2*Pi),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358016/

相关文章:

python - 为什么菜单没有显示在我的 Tkinter GUI 上?

Python 和 matplotlib 以及 Arduino

python - 如何安排热图 pcolormesh 的数据?

python - Numpy 奇怪行为转换为 datetime64 dtype

python - 我应该如何在 Pandas 中将索引与标题名称合并?

python - 如何在 Windows 的 python 上运行 pip?

python - 如何在python3中解码base64

python - Django 在静态文件中使用静态文件 URL

python - 索引错误: index is out of bounds for axis 0 python numpy

python - Numpy 是否在 x += 2 * y 这样的表达式中分配临时数组?