Python 矩阵集

Python 矩阵集,python,numpy,matrix,Python,Numpy,Matrix,我有很多矩阵(由于旋转等),但我肯定只存储一次。我想用一套: 不幸的是,我得到: TypeError:无法损坏的类型:“矩阵” 令人悲哀的是,集合正好是避免重复的正确数据类型,并且能够使用并集、交集等 如何使用Python中的矩阵集? In [299]: m1 Out[299]: matrix([[0, 0], [0, 1], [1, 1], [2, 1]]) In [300]: m2 Out[300]: matrix([[ 0, 0],

我有很多矩阵(由于旋转等),但我肯定只存储一次。我想用一套:

不幸的是,我得到:

TypeError:无法损坏的类型:“矩阵”

令人悲哀的是,集合正好是避免重复的正确数据类型,并且能够使用并集、交集等

如何使用Python中的矩阵集?

In [299]: m1
Out[299]: 
matrix([[0, 0],
        [0, 1],
        [1, 1],
        [2, 1]])

In [300]: m2
Out[300]: 
matrix([[ 0,  0],
        [ 1,  0],
        [ 1, -1],
        [ 1, -2]])

In [297]: set([tuple(m1.A1),tuple(m2.A1)])
Out[297]: {(0, 0, 0, 1, 1, 1, 2, 1), (0, 0, 1, 0, 1, -1, 1, -2)}
m1.A1
将矩阵转换为一维数组,该数组显示为简单列表。将其包装在
元组中
生成可散列的对象

set
就像一本有键但没有值的字典。两者都通过将每个键转换为“散列”来提供快速访问(以及测试中的
)。它需要元组而不是列表的部分原因是它必须是不可变的。如果更改了矩阵的一个值,则哈希值将更改

如果没有
A1
(或其他ravel),它将无法工作-请查看
元组(m1)

我们还可以将矩阵转换为字符串表示形式,并将其存储。请注意,这些转换不会节省空间,并且都会产生转换成本

我们可能需要探索如何比较这些矩阵。是什么使一个不同于另一个

匹配元素的相等性:

In [306]: m1==m2
Out[306]: 
matrix([[ True,  True],
        [False, False],
        [ True, False],
        [False, False]], dtype=bool)

In [307]: (m1==m2).all()
Out[307]: False

In [308]: (m1==m1).all()
Out[308]: True
当然,这要求它们都是相同的形状

如果形状不同,则无法逐个元素进行比较,因此返回布尔标量

In [309]: m1==m1.T
Out[309]: False
您可以比较对象ID

In [314]: set([id(m1),id(m2),id(m2[:])])
Out[314]: {3029619684, 3036025828, 3036825892}
但是它没有捕获视图的相等性(
m2[:]
具有相同的值,但是不同的对象)


另外,如果我更改一个值,例如
m2[2,1]=1
,它不会更改
id
,但会更改
元组(m2.A1)
哈希和相等性测试

这可能有助于您的python版本是什么?还有Numpy?@Basj它在我的机器上使用python2.7运行良好,这可能是因为您的Numpy版本,在这种情况下,您最好将矩阵转换为
元组
。它们是否都像您的示例4x2一样小?有多少注意元组之间的转换。这将减慢访问速度。
In [309]: m1==m1.T
Out[309]: False
In [314]: set([id(m1),id(m2),id(m2[:])])
Out[314]: {3029619684, 3036025828, 3036825892}