Python 通过列表理解的频率数据帧?

Python 通过列表理解的频率数据帧?,python,pandas,numpy,list-comprehension,Python,Pandas,Numpy,List Comprehension,我正在尝试建立一个介于A1(55Hz)和A8(7040Hz)之间的彩色频率数据帧。本质上,我希望它看起来像这样 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) 但无需手动将所有频率分配给各自的音符

我正在尝试建立一个介于A1(55Hz)和A8(7040Hz)之间的彩色频率数据帧。本质上,我希望它看起来像这样

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)
但无需手动将所有频率分配给各自的音符,每行八度(八度1到8)

根据网站,每个音符(或“半步”)之间的间距为

def hz_stepper(fixed_note, steps):
    a = 2 ** (1/12)
    return fixed_note * a ** steps
使用“hz_stepper”功能,我可以通过为步长变量指定1或-1,以彩色方式增加或减少给定音符n倍


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

只需迭代音高,然后重塑结果:

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)
解释

因子
是1d numpy数组所需的频率,但它们不是数据帧所需的表格形式<代码>重塑创建数组内容的视图,该视图具有形状
(n_八度,12)
,以便行是连续的。例如

>>> np.arange(6).reshape((2, 3))
array([[0, 1, 2],
       [3, 4, 5]])
这正是数据帧所需的格式。

从一开始:

df = pd.DataFrame(columns=['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#'])
df.loc[0] = 55*2**(np.arange(12)/12)
for i in range(8): df.loc[i+1]=2*df.loc[i]

顺便说一句,你上面的八度音阶是从C开始的,而不是从A开始的!你能解释一下重塑到底在做什么吗?“我正在阅读文档,但很难理解。”sam la补充道