我正在尝试使用 music21 python 模块从 MIDI 文件中提取数据。我遇到的问题是当我尝试从 n 元组的音符(例如第 32 个音符三元组)获取音符持续时间的数据时。该模块通常以四分音符长度的分数形式返回音符长度(例如四分音符为 1.0,八分音符为 0.5 等)。但是,对于三元组,它返回一个 python Fraction 对象(例如 Fraction(1, 12))。我有以下循环:
for note in notes_from_stream:
temp_arr = []
temp_arr.append(get_midi_representation(note))
temp_arr.append(note.duration.dots)
temp_arr.append(note.duration.quarterLength)
tup = float(note.duration.quarterLength.numerator) / (note.duration.quarterLength.denominator)
temp_arr.append(tup)
note_list_arr.append(temp_arr)
temp_arr 在每次迭代结束时添加到 note_list_arr 中。循环完成后,我使用 numpy.asarray() 函数从 note_list_arr 创建一个新的 2x2 numpy 数组。所以,实际的问题是,在所有数据都在 numpy 数组中之后,我得到了以下内容:
[[128 0 Fraction(1, 12) 0.08333333333333333]
[128 0 Fraction(1, 24) 0.041666666666666664]]
问题在于它包含 Fraction 对象,但是如果我删除将其放在那里的行 (temp_arr.append(note.duration.quarterLength)
并只留下计算的那一行分数的实数值,我得到以下结果:
[[ 1.28000000e+02 0.00000000e+00 8.33333333e-02]
[ 1.28000000e+02 0.00000000e+00 4.16666667e-02]]
数组中的所有值都转换为带有指数表示法的 float 。我怎样才能避免这种情况?
最佳答案
dtype
的用途是什么
[[128 0 Fraction(1, 12) 0.08333333333333333]
[128 0 Fraction(1, 24) 0.041666666666666664]]
我猜是对象
。每个元素都是指向不同类型项目的指针,其中一些是整数,一些是 float ,还有一些分数
。这与嵌套列表几乎相同。这是 numpy
尝试将一组不同的对象放入一个数组的结果。
[[ 1.28000000e+02 0.00000000e+00 8.33333333e-02]
[ 1.28000000e+02 0.00000000e+00 4.16666667e-02]]
看起来像 dtype float
。整数和 float 都以 float 形式存储和显示。不用担心科学记数法;这正是显示器处理值范围的方法。它们是普通的花车。
第一个是一个 (n,4)
数组,n
个音符,每个音符 4 个值。
您可能可以将创作写为:
temp_arr = [get_midi_representation(note)),
note.duration.dots,
note.duration.quarterLength,
float(note.duration.quarterLength.numerator) /
(note.duration.quarterLength.denominator)]
关于python - 具有不同数据类型的 Numpy 数组表现得很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35591679/