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