【问题标题】:How to convert a python set to a numpy array?如何将 python 集转换为 numpy 数组?
【发布时间】:2012-01-17 22:57:59
【问题描述】:

我在 python 中使用集合操作来执行两个 numpy 数组之间的对称差异。然而,结果是一个集合,我需要将它转换回一个 numpy 数组才能继续前进。有没有办法做到这一点?这是我尝试过的:

a = numpy.array([1,2,3,4,5,6])
b = numpy.array([2,3,5])
c = set(a) ^ set(b)

结果是一个集合:

In [27]: c
Out[27]: set([1, 4, 6])

如果我转换为一个 numpy 数组,它会将整个集合放在第一个数组元素中。

In [28]: numpy.array(c)
Out[28]: array(set([1, 4, 6]), dtype=object)

然而,我需要的是:

array([1,4,6],dtype=int)

我可以循环遍历元素以逐个转换,但我将有 100,000 个元素,并希望有一个内置函数来保存循环。谢谢!

【问题讨论】:

    标签: python arrays numpy set


    【解决方案1】:

    试试:

    numpy.fromiter(c, int, len(c))
    

    这比使用列表作为中间产品的解决方案快一倍。

    【讨论】:

      【解决方案2】:

      试试这个。

      numpy.array(list(c))
      

      在初始化 numpy 数组之前转换为列表会将单个元素设置为整数,而不是将第一个元素设置为对象。

      【讨论】:

        【解决方案3】:

        不要将 numpy 数组转换为执行异或的集合。直接使用setxor1d

        >>> import numpy
        >>> a = numpy.array([1,2,3,4,5,6])
        >>> b = numpy.array([2,3,5])
        >>> numpy.setxor1d(a, b)
        array([1, 4, 6])
        

        【讨论】:

        • 是不是用了numpy的set例程,比如setxor1d,比较次数多的时候不好?也许是一个新问题,但我认为与这个答案非常相关。就我而言,我将拥有 100k 个对象和 10m+ 集操作。
        【解决方案4】:

        做:

        >>> numpy.array(list(c))
        array([1, 4, 6])
        

        而且 dtype 是 int(我这边是 int64。)

        【讨论】:

        • 感谢铁托!现在我看到 KennyTM 有一个更有效的答案,但你的也很好!
        • 这实际上回答了标题中的问题。
        猜你喜欢
        • 1970-01-01
        • 2022-06-13
        • 2021-05-15
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 2017-09-04
        • 2021-11-29
        • 2021-06-09
        相关资源
        最近更新 更多