矩阵集

时间:2016-06-18 13:52:56

标签: python numpy matrix

我有很多矩阵(由于轮换等原因),但我肯定只存储一次。我想到使用一套

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中的矩阵集?

1 个答案:

答案 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)哈希和相等测试。