首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从(-Pi,Pi)到(0,2*Pi)的Numpy角度转换范围

从(-Pi,Pi)到(0,2*Pi)的Numpy角度转换范围
EN

Stack Overflow用户
提问于 2016-05-21 01:31:26
回答 5查看 40.3K关注 0票数 20

这似乎是非常直截了当的,但我似乎不知道如何将-Pi和Pi之间的角度映射到0到2Pi之间。我试着使用np.select,但由于某种原因,它冻结了我的程序。我需要在这个范围内的角度,因为它们将作为训练数据的神经网络,不能输出负数。

代码语言:javascript
复制
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)

我需要音频

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-05-21 01:56:30

让我们说你有这样的角度:

代码语言:javascript
复制
>>> 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])

有两种可能的方法。

  1. 使用numpy表达式查找负值..。

小于零的应该转换为正确的值。就像这样:

代码语言:javascript
复制
>>> (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值映射到1False值映射到0。你可以把这两个概念结合起来得到你的答案。

  1. 您可以简单地认识到,这是一个您正试图解决的数学表达式:

要做到这一点,只需将2*np.pi添加到所有内容中,并接受模块。这就像找到“单位位置”,或者把一个数字转换成八进制数字等等.

代码语言:javascript
复制
>>> (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])

我希望这能帮到你。

票数 12
EN

Stack Overflow用户

发布于 2016-05-21 04:01:42

下面是几种不同的方法,包括计时:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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创建的返回值)。如果是这样的话,那么您可能会更好地纠正相位一帧一帧。

票数 15
EN

Stack Overflow用户

发布于 2018-09-25 08:46:14

-Pi和+Pi之间的角度:

代码语言:javascript
复制
>>> import numpy as np
>>> angles = np.linspace(-np.pi, np.pi, 10)

移到0到2*Pi:

代码语言:javascript
复制
>>> 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])
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37358016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档