16

I have a list like this:

l=[(1,2),(3,4)]

I want to convert it to a numpy array,and keep array item type as tuple:

array([(1,2),(3,4)])

but numpy.array(l) will give:

array([[1,2],[3,4)]])

and item type has been changed from tuple to numpy.ndarray,then I specified item types

numpy.array(l,numpy.dtype('float,float'))

this gives:

 array([(1,2),(3,4)])

but item type isn't tuple but numpy.void,so question is:

 how to convert it to a numpy.array of tuple,not of numpy.void? 
kmario23
  • 50,454
  • 13
  • 141
  • 141
Alex Luya
  • 8,442
  • 15
  • 55
  • 84

2 Answers2

21

You can have an array of object dtype, letting each element of the array being a tuple, like so -

out = np.empty(len(l), dtype=object)
out[:] = l

Sample run -

In [163]: l = [(1,2),(3,4)]

In [164]: out = np.empty(len(l), dtype=object)

In [165]: out[:] = l

In [172]: out
Out[172]: array([(1, 2), (3, 4)], dtype=object)

In [173]: out[0]
Out[173]: (1, 2)

In [174]: type(out[0])
Out[174]: tuple
Divakar
  • 212,295
  • 18
  • 231
  • 332
6

For some reason you can't simply do this if you're looking for a single line of code (even though Divakar's answer ultimately leaves you with dtype=object):

np.array([(1,2),(3,4)], dtype=object)

Instead you have to do this:

np.array([(1,2),(3,4)], dtype="f,f")

"f,f" signals to the array that it's receiving tuples of two floats (or you could use "i,i" for integers). If you wanted, you could cast back to an object by adding .astype(object) to the end of the line above).

SuperCodeBrah
  • 2,382
  • 2
  • 17
  • 25