0

I am converting code to write a function from a different data type.

The original code was:

        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)])

Now my input data is a 2-dimensional list, I am not working with notes anymore.

 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)]) 

I am struggling to add the columns at once.

elements[2] seems to give me the row instead of the column. I can't seem to replace the for loop. Maybe my syntax is all off, I am used to java and c++, fairly new to Python.

--Update--

Based on Tarun Gaba's answer, I tried this:

    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)]);

Gives me an error:

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

Here is the output of 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']]
5
  • You could just transform elements to numpy array elements = np.array(elements) and then elements[:, 2] will select the 3nd column for you. Commented Dec 3, 2014 at 11:56
  • If I do that, then it gives me: TypeError: only length-1 arrays can be converted to Python scalars Commented Dec 3, 2014 at 12:00
  • Could you put an example of elements list? Commented Dec 3, 2014 at 12:31
  • I have added the contents of elements in the question. Commented Dec 3, 2014 at 14:08
  • Just posted an answer. Commented Dec 3, 2014 at 18:20

2 Answers 2

2

elements is a list of lists here. To access 3rd column(as what you seem to be trying by elements[2]), you need to do something like this:

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

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

For your case, It should be something on the lines of:

np.array([el[2] for el in elements], [float(el[0]) for el in elements], [float(el[1])) for el in elements], dtype= ..... 
Sign up to request clarification or add additional context in comments.

5 Comments

Based on this, I have changed my code, see updated question. I get an error that a float is required now. Getting closer perhaps...
I think, you are using round for non-float. A round is not defined for non-floats in python. try removing the round() from round(el[2])
When I remove the round(), I get: TypeError: 'tuple' object is not callable
You should be creating three lists independently. I have updated my answer. Hope it helps
Adding this fixed it element.append(float(x.strip('\r\n')));
1

The problem is that your data is read as list of strings.

Modify your code from:

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

To:

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

To have your data as floats. You could also use round(float(...)) if you need rounded data.

Then put the data into a numpy array:

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

And access to the columns as data[:, column_idx], e.g. for column 3:

>>> data[:, 2]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.