Python 矩阵集
我有很多矩阵(由于旋转等),但我肯定只存储一次。我想用一套: 不幸的是,我得到: TypeError:无法损坏的类型:“矩阵” 令人悲哀的是,集合正好是避免重复的正确数据类型,并且能够使用并集、交集等 如何使用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],
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}