python - 通过列表理解的频率数据框?

标签 python pandas numpy list-comprehension

我正在尝试构建 A1 (55Hz) 和 A8 (7040Hz) 之间色度的 pandas DataFrame。本质上,我希望它看起来像这样......

df = pd.DataFrame(columns=['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#'])
df.loc[0] = (55, 58.27, 61.74, 32.7, 34.65, 36.71, 38.89, 41.2, 43.65, 49, 51.91)

但无需手动将所有频率分配给各自的音符,并且每行一个 Octave ( Octave 1 至 8)。

基于网站http://pages.mtu.edu/~suits/notefreqs.html ,给定单个音符的每个音符(或“半步”)之间的间距是...

def hz_stepper(fixed_note, steps):
    a = 2 ** (1/12)
    return fixed_note * a ** steps

使用该函数“hz_stepper”,我可以通过将 1 或 -1 分配给steps 变量来以半音方式增加或减少给定音符 n 次。

我的问题是,如何创建一个 DataFrame,其中所有行看起来都像我手动完成的那样,但使​​用列表理解来形成行?

最佳答案

只需迭代音调并随后 reshape 结果:

import numpy as np
import pandas as pd

base = 55.
n_octave = 8
columns = ['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#']

factors = 2**(np.arange(12 * n_octave) / 12.)
pd.DataFrame(data=base * factors.reshape((n_octave, 12)), columns=columns)

说明

factors 是 1d numpy 数组所需的频率,但它们不是 DataFrame 所需的表格形式。 reshape 创建数组内容的 View ,其形状为 (n_octave, 12),使得行是连续的。例如

>>> np.arange(6).reshape((2, 3))
array([[0, 1, 2],
       [3, 4, 5]])

这只是 DataFrame 所需的格式。

关于python - 通过列表理解的频率数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53233168/

相关文章:

python - Pandas 对象索引

python - 计算相对于给定人口的百分位数排名

python - FFTW 产生与 numpy.fft 不同的结果

python - Scipy 安装问题,出现 ImportError : libopenblas. so.0: 无法打开共享对象文件或目录

python - 如何使 OptionMenu 保持相同的宽度?

python - 使用PIL python来计算灰度等级的errorType

python - 如何绘制 Pandas 数据框的某些行

python - 如何进行分组并获取收入变化百分比

python - Snakemake:在 Expand() 中使用正则表达式

python - 在 Django 中加载和存储数据以进行缓存的全局常量的好方法是什么?