【问题标题】:TypeError: unhashable type: 'matrix' [closed]TypeError:不可散列的类型:“矩阵”[关闭]
【发布时间】:2017-11-23 22:04:26
【问题描述】:

我遇到如下错误。 我从另一本书中看到了这段代码,但它不起作用。 我该如何解决? 提前致谢!

import numpy as np
a = [1, 2, 3, 2]
Ma = np.mat(a)
Sa2 = set(Ma)      #error

【问题讨论】:

  • 你希望在系列中出现什么?你就不能Sa2 = set(a)吗?
  • 以上代码简单总结,实际代码中很难参考a。
  • 使用底层数组数据:set(Ma.A1)?
  • 不管怎样都可以,但是如果a是多维列表并且是动态引用的,那么如何使用呢?这意味着不是 A1。

标签: python numpy


【解决方案1】:

您可以使用以下方法将矩阵展平为 ndarray。

import numpy as np
a = [1, 2, 3, 2]
Ma = np.mat(a)
Sa2 = set(np.asarray(Ma).ravel())
print (Sa2)
>>> '{1, 2, 3}'

【讨论】:

    【解决方案2】:

    您可以使用Ma.A1 将矩阵转换为一维数组,该数组显示为一个简单的列表。将其包装在元组中会生成一个可散列的对象。

    >>> import numpy as np
    >>> a = [1, 2, 3, 2]
    >>> Ma = np.mat(a)
    >>> Sa2 = set(Ma)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'matrix'
    >>> set(Ma.A1)
    set([1, 2, 3])
    

    另一种方式:

    >>> set(Ma.flat)
    set([1, 2, 3])
    

    更多详情来自Set of matrices

    Constructing a python set from a numpy matrix

    【讨论】:

      【解决方案3】:

      set 尝试对其输入进行迭代,实际上将其视为一个列表:

      In [61]: list(np.mat([1,2,3,4]))
      Out[61]: [matrix([[1, 2, 3, 4]])]     # a 1 item list
      In [62]: list(np.mat([1,2,3,4]).A1)
      Out[62]: [1, 2, 3, 4]
      

      np.mat 将其输入转换为 (1,4) 数组,任何迭代都会产生相同的结果。而set 不能散列整个矩阵对象。

      您想要矩阵中的 4 个数字中的 set 什么?还是矩阵的“行”? set 不适用于嵌套列表或包含数组或矩阵的列表。集合的元素必须是“可散列的”、不可变的。数字和元组工作。列表和字典没有。

      【讨论】:

        猜你喜欢
        • 2016-03-16
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 2019-01-29
        • 2012-02-19
        • 1970-01-01
        • 2018-12-26
        相关资源
        最近更新 更多