【问题标题】:python - find a matrix in a dictionarypython - 在字典中查找矩阵
【发布时间】:2017-08-20 17:33:31
【问题描述】:

我有一本字典 g,其项目是 numpy 矩阵。

import numpy as np

h = np.array(([1,2],[3,4]))
g = {}
g[0] = np.array(([1,2,3],[3,4,5]))
g[1] = np.array(([11,22],[3,4]))
g[2] = np.array(([1,2],[3,4]))
g[3] = np.array(([0,2],[3,0]))

我想检查h 是否在字典g 中。在这种情况下是的,因为g[2] 正是h

有没有办法在字典中查找矩阵?

【问题讨论】:

  • h in g.values()?
  • h in g.values() 返回:Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

标签: python-2.7 numpy dictionary matrix


【解决方案1】:

也许是内置函数numpy.array_equal

【讨论】:

  • 我试过了,它似乎工作得很好。 ` >>> a = numpy.array([[1,2], [3,4]]) >>> b = numpy.array([[1,2], [3,4]]) >>> numpy.array_equal(a, b) True `
【解决方案2】:

我发现这个有点脏的解决方案:

any(h in val for val in g.values())

【讨论】:

    【解决方案3】:

    这只是phg1024 所写内容的延伸:

    any([np.array_equal(h, x) for x in g.values()])
    

    【讨论】:

      【解决方案4】:

      所有优秀的答案。但是,如果你关心速度(你真的应该这样做:)),我认为要使用的杀手级组合是 np.anygenerator 表达式

      # use generator comprehension instead of list comprehension
      np.any((np.array_equal(h, dict_arr) for dict_arr in g.values()))
      

      效率(按降序排列)

      # with np.any & generator comprehension
      In [126]: %timeit np.any((np.array_equal(h, arr) for arr in g.values()))
      100000 loops, best of 3: 18.5 µs per loop
      
      # with python's any & generator comprehension
      In [129]: %timeit any((np.array_equal(h, arr) for arr in g.values()))
      10000 loops, best of 3: 35.6 µs per loop
      
      # with python's any & list comprehension
      In [130]: %timeit any([np.array_equal(h, arr) for arr in g.values()])
      10000 loops, best of 3: 48.9 µs per loop
      
      # with np.any & list comprehension
      In [128]: %timeit np.any([np.array_equal(h, arr) for arr in g.values()])
      10000 loops, best of 3: 69.1 µs per loop
      

      所以,生成器理解在大多数情况下都会获胜!

      【讨论】:

      • 感谢您的见解!
      猜你喜欢
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多