在python中读取新数组中的行元素

时间:2014-12-03 11:40:41

标签: python numpy

我正在转换代码以从不同的数据类型编写函数。

原始代码是:

        note_inf_track = np.array([(n.note, n.onset/div, n.duration/div, n.velocity, n.channel, track_nr)
                                    for n in m.tracks[track_nr].notes], 
                                  dtype = [('pitch', np.int), 
                                           ('onset', np.float), 
                                           ('duration', np.float), 
                                           ('velocity', np.int),
                                           ('channel', np.int),
                                           ('track', np.int)])

现在我的输入数据是一个二维列表,我不再使用笔记了。

 for line in lines:
      #print("b");
      element = [];
      for x in line.split(','):
         element.append(x.strip('\r\n'));
      elements.append(element);


  note_inf_track = np.array([(round((round(np.asarray(elements[2], dtype="float")))), (round(np.asarray(elements[0], dtype="float"))),(round(np.asarray(elements[:][1], dtype="float"))))], 
                  dtype = [('pitch', np.int), 
                    ('onset', np.float), 
                    ('duration', np.float)]) 

我正在努力立刻添加列。

元素[2]似乎给了我行而不是列。我似乎无法取代for循环。也许我的语法已经全部关闭,我已经习惯了java和c ++,相当新的Python。

- 更新 -

根据Tarun Gaba的回答,我尝试了这个:

    note_inf_track = np.array([((round(el[2])), float(el[0]),float(el[1])) for el in elements],
                dtype = [('pitch', np.int)
                ('onset', np.float),
                ('duration', np.float)]);

给我一​​个错误:

note_inf_track = np.array([((round(el[2])), float(el[0]),float(el[1])) for el in elements],
TypeError: a float is required

这是print(elements)的输出:

[['0.066667', ' 0.200000', ' 50.180000', ' 0.000644'], ['0.266667', ' 0.266667', ' 59.180000', ' 0.006583'], ['0.550000', ' 0.366667', ' 59.180000', ' 0.002129'], ['0.933333', ' 0.350000', ' 59.180000', ' 0.005972'], ['1.316667', ' 0.050000', ' 59.180000', ' 0.010053'], ['1.366667', ' 0.166667', ' 61.180000', ' 0.008109'], ['1.550000', ' 0.233333', ' 61.180000', ' 0.009170'], ['1.783333', ' 0.416667', ' 63.180000', ' 0.023811'], ['2.250000', ' 0.166667', ' 63.180000', ' 0.016253'], ['2.416667', ' 0.850000', ' 64.180000', ' 0.019314'], ['3.300000', ' 0.116667', ' 64.180000', ' 0.018684'], ['3.433333', ' 0.133333', ' 64.180000', ' 0.016786'], ['3.583333', ' 0.333333', ' 63.180000', ' 0.008623'], ['4.816667', ' 0.383333', ' 63.180000', ' 0.036858'], ['5.200000', ' 0.166667', ' 61.180000', ' 0.006060'], ['5.366667', ' 0.366667', ' 63.180000', ' 0.010417'], ['5.783333', ' 0.333333', ' 63.180000', ' 0.008371'], ['6.116667', ' 0.383333', ' 64.180000', ' 0.007488'], ['6.533333', ' 0.233333', ' 64.180000', ' 0.014582'], ['6.766667', ' 0.333333', ' 63.180000', ' 0.004457'], ['7.533333', ' 0.516667', ' 61.180000', ' 0.004700'], ['8.050000', ' 0.316667', ' 63.180000', ' 0.006959'], ['8.366667', ' 0.300000', ' 64.180000', ' 0.013522'], ['8.666667', ' 0.166667', ' 63.180000', ' 0.008083'], ['8.833333', ' 0.150000', ' 64.180000', ' 0.010620'], ['8.983333', ' 0.250000', ' 63.180000', ' 0.004493'], ['9.233333', ' 0.116667', ' 64.180000', ' 0.012834'], ['9.350000', ' 0.333333', ' 63.180000', ' 0.005321'], ['9.716667', ' 0.300000', ' 64.180000', ' 0.006902'], ['10.033333', ' 0.183333', ' 63.180000', ' 0.002515'], ['10.216667', ' 0.133333', ' 62.180000', ' 0.005928'], ['10.350000', ' 0.600000', ' 63.180000', ' 0.004920'], ['10.950000', ' 0.133333', ' 64.180000', ' 0.006754'], ['11.083333', ' 0.116667', ' 63.180000', ' 0.003831'], ['11.200000', ' 0.316667', ' 62.180000', ' 0.002493']]

2 个答案:

答案 0 :(得分:2)

elements是此处列表的列表。 要访问第3列(正如您在元素[2]中尝试的那样),您需要执行以下操作:

elements = [[1,2,3], \
            [4,5,6], \
            [7, 8, 9]]

column  = [i[2] for i in elements]
print column
#[3,6,9]

对于你的情况,它应该是:

np.array([el[2] for el in elements], [float(el[0]) for el in elements], [float(el[1])) for el in elements], dtype= ..... 

答案 1 :(得分:1)

问题是你的数据被读作字符串列表。

修改您的代码:

element.append(x.strip('\r\n'));

要:

element.append(float(x.strip('\r\n')));

将您的数据设为浮点数。如果您需要舍入数据,也可以使用round(float(...))

然后将数据放入一个numpy数组中:

>>> import numpy as np
>>> data = np.array(elements)

以[{1}}访问列,例如第3栏:

data[:, column_idx]