我有很多矩阵(由于轮换等原因),但我肯定只存储一次。我想到使用一套:
print set([np.matrix([[0, 0],[0, 1],[1, 1],[2, 1]]),
np.matrix([[0, 0],[1, 0],[1, -1],[1, -2]])])
不幸的是,我得到了:
TypeError:不可用类型:'matrix'
令人难过,因为一个集合将是完全正确的数据类型以避免重复,并且能够使用并集,交集等。
如何使用Python中的矩阵集?
答案 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
将矩阵转换为1d数组,该数组显示为简单列表。在tuple
中包裹使得可以编辑的对象。
set
就像一个带键但没有值的字典。两者都通过将每个密钥转换为“哈希”来提供快速访问(以及in
测试)。它需要一个元组的部分原因,而不是列表,它必须是不可变的。如果您更改了矩阵的其中一个值,则哈希值会发生变化。
如果没有A1
(或其他ravel)它不起作用 - 请查看tuple(m1)
。
In [302]: set([tuple(m1),tuple(m2)])
...
TypeError: unhashable type: 'matrix'
In [303]: tuple(m1)
Out[303]: (matrix([[0, 0]]), matrix([[0, 1]]), matrix([[1, 1]]), matrix([[2, 1]]))
我们还可以将矩阵转换为某种字符串表示形式,然后存储它。请注意,这些转化不会为您节省空间,并且都会产生转化费用。
我们可能需要探索如何比较这些矩阵。是什么让一个人与众不同?
匹配元素的平等性:
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
,但会更改tuple(m2.A1)
哈希和相等测试。