如何有效地设置Numpy数组?

时间:2015-10-18 08:59:28

标签: python numpy set

我用过:

df['ids'] = df['ids'].values.astype(set)

lists转换为sets,但输出的列表不是一组:

>>> x = np.array([[1, 2, 2.5],[12,35,12]])

>>> x.astype(set)
array([[1.0, 2.0, 2.5],
       [12.0, 35.0, 12.0]], dtype=object)

是否有一种有效的方法可以将列表转换为Numpy中的设置?

编辑1:
我的意见如下:
我有3,000条记录。每个都有30,000个ID:[[1,...,12,13,...,30000],[1,..,43,45,...,30000],......,[...] ]

3 个答案:

答案 0 :(得分:4)

您问题的当前状态(可以随时更改):如何有效地从大量数组中删除唯一元素?

import numpy as np

l=np.random.rand(3000,30000)
lout1=map(np.unique,l)
#or
lout2=[np.unique(ll) for ll in l]

运行时:

In [86]: timeit map(np.unique,lbig)
1 loops, best of 3: 6.03 s per loop
In [87]: timeit [np.unique(ll) for ll in lbig]
1 loops, best of 3: 6.09 s per loop

更新:正如@hpaulj在评论中指出的那样,我的虚拟示例存在偏差,因为浮点随机数几乎肯定是唯一的。所以这里是一个更像逼真的例子,带有整数:

In [29]: l=np.random.random_integers(low=1,high=15000,size=(3000,30000))

In [30]: timeit map(np.unique,l)
1 loops, best of 3: 5.43 s per loop

In [31]: timeit [np.unique(ll) for ll in l]
1 loops, best of 3: 5.42 s per loop

在这种情况下,输出列表的元素具有不同的长度,因为要删除实际的重复项。

答案 1 :(得分:2)

首先展平你的ndarray以获得一维数组,然后在其上应用set():

set(x.flatten())

编辑:因为看起来你只想要一个集合数组,而不是整个数组的集合,所以你可以value = [set(v) for v in x]来获取集合列表。

答案 2 :(得分:0)

之前的几个' row-wise'独特的问题:

vectorize numpy unique for subarrays

Numpy: Row Wise Unique elements

Count unique elements row wise in an ndarray

在其中的几个中,计数比实际的唯一值更有趣。

如果每行的唯一值数量不同,则结果不能是(2d)数组。这很好地表明问题无法完全矢量化。您需要对行进行某种迭代。