How convert a list of tupes to a numpy array of tuples?

Question:

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? 
Asked By: Alex Luya

||

Answers:

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
Answered By: Divakar

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

Answered By: SuperCodeBrah

Just discovered that pandas has a way to take care of this.
You can use their MultiIndex class to create an array of tuples
since all pandas Indexes are wrapped 1-D numpy arrays.
It’s as easy as calling the Index constructor on a list of tuples.

>>> import pandas as pd
>>> tups = [(1, 2), (1, 3)]
>>> tup_array = pd.Index(tups).values
>>> print(type(tup_array), tup_array)
<class 'numpy.ndarray'> [(1, 2) (1, 3)]
Answered By: TheBrilliot
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.