建立一个numpy maxtix

时间:2017-10-21 17:35:55

标签: python numpy

我正在尝试从文件构建翻译矩阵。该文件如下所示,表示钢琴音符的开始和偏移时间

OnsetTime   OffsetTime  MidiPitch
0.500004    0.85356     37
1.20712     1.50441     38
1.80171     2.0517      39
...

我试图将其扁平化为钢琴状态表示和事件时间,例如

Event    State
time     Piano state, array of length 88
...

为此,我构建了以下代码

eventArray = np.array([])
with open('event_log.txt') as tsv:
        noteState = [0] * 88
        iterator = iter(csv.reader(tsv, dialect="excel-tab"))
        next(iterator)
        for line in iterator:
            notePosition = int(float(line[2])) - 21
            noteState[notePosition] = 1
            np.concatenate(eventArray, np.array([float(line[0]), noteState]))
            noteState[notePosition] = 0
            np.concatenate(eventArray, np.array([float(line[1]), noteState]))

但是当我执行此操作时,我收到以下错误

   File "main.py", line 32, in <module>
   np.concatenate(eventArray, np.array([float(line[0]), noteState]))
   ValueError: setting an array element with a sequence.

我应该如何建立这个矩阵?我正在使用numpy切片并根据需要重塑矩阵。

修改

在我现在有评论后尝试了建议

np.concatenate(eventArray, np.array([[float(line[0])], noteState]))

并收到以下错误

Traceback (most recent call last):
  File "main.py", line 32, in <module>
    np.concatenate(eventArray, np.array([[float(line[0])], noteState]))
 TypeError: only integer scalar arrays can be converted to a scalar index

1 个答案:

答案 0 :(得分:2)

不要concatenate迭代。 np.concatenate每步返回一个新数组。它不会修改数组。

alist = []
with open('event_log.txt') as tsv:
        noteState = [0] * 88
        iterator = iter(csv.reader(tsv, dialect="excel-tab"))
        next(iterator)
        for line in iterator:
            notePosition = int(float(line[2])) - 21
            noteState[notePosition] = 1
            alist.append(np.array([float(line[0]), noteState]))
            noteState[notePosition] = 0
            alist.append(np.array([float(line[1]), noteState]))

那应该创建一个数组列表。如果这些数组的长度都相同,那么

arr = np.array(alist)

应该创建一个2d浮点数组。如果它们的长度不同,我建议

arr = np.concatenate(alist)

制作具有相同值的扁平(1d)数组。

我假设其余代码都是正确的。

打印alist以验证值是否合理。