如何将元组列表转换为numpy元组数组?

25

我有一个像这样的列表:

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

我想将它转换为一个numpy数组,并保持数组项的类型为元组。
array([(1,2),(3,4)])

但是numpy.array(l)将会给出:

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

并且项目类型已经从元组改变为numpy.ndarray,然后我指定了项目类型。

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

这将会给出:

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

但是项类型不是元组,而是numpy.void,所以问题是:

 how to convert it to a numpy.array of tuple,not of numpy.void? 
3个回答

26

您可以拥有一个object dtype的数组,使得数组的每个元素都是一个元组,就像这样 -

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

示例运行 -

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

5
为什么这个能运行,但是 np.array([(1,2),(3,4)], dtype=object) 不行? - SuperCodeBrah

8

如果你只是想要查找一行代码,由于某些原因,你不能简单地执行以下操作(尽管Divakar的答案最终会给出dtype=object):

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

相反,你必须这样做:

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

"f,f"表示数组正在接收两个浮点数元组(或者您可以使用"i,i"来表示整数)。如果您想要,您可以通过在上面的行末添加.astype(object)来强制转换回对象。


1
举个例子,当“ f,f”起作用而object不起作用时:我有一个numpy元组数组,并想要检查每个元组是否存在于另一个元组数组中,使用np.isin()。使用object数组无效,但使用“ f,f”数组有效。 - dylanvanw

0
刚刚发现pandas有一种方法可以解决这个问题。 您可以使用它们的MultiIndex类来创建元组数组,因为所有pandas索引都包装在1-D numpy数组中。 只需在元组列表上调用Index构造函数即可。
>>> 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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接