使用scipy数组设置操作

时间:2012-11-18 15:57:43

标签: python numpy scipy set

Python有一个非常好的'set'数据结构,它基本上是一个无序列表,可以启用set操作。 我很想将这样的数据结构用于以下目的:

我有一组来自调查的数据点(每个点是一个两元素的Scipy / numpy数组),可以根据受访者的性别和婚姻状况划分为不同的子集。

不幸的是, Python集似乎不允许所谓的可变对象,例如numpy arays和lists 。 我可以使用元组作为我的数据点,但我想知道是否有更好的方法来做到这一点。

理想情况下,我希望有几个无序的数据点列表(集合),我可以交叉,联合等等。 - 我可以迭代(在各个数据点上,以及用于绘图的集合列表)目的)。

所以我的问题是:使用元组集是在这种情况下做我想要的唯一方法吗?在Python中真的不可能有多组可变元素(例如numpy数组)?

2 个答案:

答案 0 :(得分:2)

python中的

python-sets必须是hashable。因此,您可以定义class datapoint并实现__hash__(self)__eq__(self)作为其元素的函数,并将这些实例添加到您的集合中。

或许你想使用named tuple。我没有对它们进行测试,但它们也实现了__hash____eq__。它们仍然是元组,但至少,它们可以以更易读的方式访问。

答案 1 :(得分:-1)

可变对象集是一个复杂的概念。应该是什么

a = set([]); 
a.add (object1);
a.add (object2);
object3 = object1;
object1 = object2;
object1 = object3;
print (len(a));

打印?你可以说这个集合应该在它们相等时折叠了object1和object2,但这基本上是无法实现的。在中间粘贴print(len(a))不应该改变 - len应该是一个纯函数 - 但这意味着set必须存储多个对象,并在操作时确定哪些对象是相同的对他们做了。当然

print (len(a))
object1 = object3
print (len(a))

印刷1 2也有点令人惊讶。以高效且合理的语义实现对可变对象的设置是非常困难的,这就是Python没有尝试的原因。

编辑:然后尝试

a = set([])
a.add (mutable_array([1,2]));
a.add (mutable_array([1,3]));
for i in a:
     i[1] = 2
print (len(a));

重点是:如果你在一个集合中粘贴一个可变对象,那么该集合最终将会出现重复,或者该集合必须跟踪它们中的变化。