如何高效地将2D numpy数组转换为由元组组成的1D numpy数组?

4

我发现这个问题是有关使用迭代器将列表转换为元组的,但我正在处理大型数据集。

我发现这个问题是有关从元组到列表的转换,实际上有很多关于将元组列表转换为数组的问题,但是我还没有找到如何进行反向转换...

我有:

np.arrray([[   0    1]
           [   1    1]
           [   2    1]
           ..., 
           [1004    3]
           [1005    1]
           [1006    1]])

我想要:

np.arrray([(   0    1)
           (   1    1)
           (   2    1)
           ..., 
           (1004    3)
           (1005    1)
           (1006    1)])

我不一定需要一个由元组组成的numpy数组,但是我希望能够高效地完成它。


我不一定需要一个由元组组成的NumPy数组,但我想要高效地完成它 - 你试过普通的列表推导吗? - RomanPerekhrest
@RomanPerekhrest 谢谢您的快速回复。列表推导式不是与这个问题中的答案相同吗? - mattyd2
1
你可以用一个一维的numpy数组(或其他序列)中的元组做什么,而不能直接用二维的numpy数组做到的呢? - jez
@jez 我需要将它反馈到一个叫做Gensim的自然语言处理库中... - mattyd2
2个回答

8
为了高效地向量化这个转换,需要对其进行转置。
a = np.array([[   0 ,   1],
              [   1 ,   1],
              [   2 ,   1],
              [   0 ,   1],
              [   1 ,   1],
              [   2 ,   1] ])

at = a.T 

at= array([[0, 1, 2, 0, 1, 2],
          [1, 1, 1, 1, 1, 1]])

然后使用zip将这两个一维列表转换为元组列表。

zip(at[0],at[1])

这将比列表推导式快得多。 但在Python 3.4中,
list(zip(at[0],at[1])

Out []:
[(0, 1), (1, 1), (2, 1), (0, 1), (1, 1), (2, 1)]

编辑:感谢 @Divakar 的建议。

可以通过直接切片可能略微提高速度:zip(a[:,0], a[:,1])


1
我的系统上快了3倍。非常酷的创新解决方案! - jez
2
通过直接切片可能会更快:zip(a[:,0], a[:,1]) - Divakar
@SerialDev 真是太棒了!谢谢你! - mattyd2

1
你可以使用简单直接的Python,并获得元组的列表(或其他内容):
list(map(tuple, arr))

在编程中,map()函数会依次对数组中的每一行应用tuple()函数。


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