我正在尝试使用music21 Python模块从MIDI文件中提取数据。我遇到的问题是,当我试图从一个n元组音符(例如三连音的三十二分音符)中获取音符持续时间的数据时。该模块通常会将音符长度返回为四分音符长度的分数(例如,四分音符是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创建一个新的2×2 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]]
数组中的所有值都被转换为带指数表示法的浮点数。我该如何避免这种情况?
回答:
dtype
是什么
[[128 0 Fraction(1, 12) 0.08333333333333333] [128 0 Fraction(1, 24) 0.041666666666666664]]
我猜是object
。每个元素都是指向不同类型项目的指针,有些是整数,有些是浮点数,还有一些是Fraction
。这几乎与嵌套列表相同。这是numpy
尝试将一组多样化的对象放入一个数组的结果。
[[ 1.28000000e+02 0.00000000e+00 8.33333333e-02] [ 1.28000000e+02 0.00000000e+00 4.16666667e-02]]
看起来是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)]