【问题标题】:How to find decimal value of 1D binary array in numpy Python如何在numpy Python中找到一维二进制数组的十进制值
【发布时间】:2018-02-11 11:34:15
【问题描述】:

我有一个像这样的布尔型 numpy 数组,

>>> np_arr
array([[1, 1, 1, 1, 0, 0, 1, 1],
       [1, 1, 1, 1, 0, 0, 1, 1],
       [1, 1, 1, 1, 0, 0, 1, 1],
       [1, 1, 1, 1, 0, 0, 1, 1],
       [1, 1, 1, 1, 0, 0, 1, 1],
       [1, 1, 1, 1, 0, 1, 0, 0],
       [1, 1, 1, 1, 0, 1, 0, 0],
       [1, 1, 1, 1, 0, 1, 0, 0]])

还有一个像这样的一维数组,

>>> another_arr
array([128,  64,  32,  16,   8,   4,   2,   1])

我想以某种方式做一些 andaddition 以仅获取存在 1 的值,例如,

>>> np_arr
array([[128,64,32,8, 0, 0, 2, 1],
       [128,64,32,8, 0, 0, 2, 1],
         ....................
       [128,64,32,8, 0,4, 0, 0],
        .....................)

然后我可以将它们相加以找到 2D 数组中每个 1D 数组的二进制值.. 或者是一些简单的方法来获取十进制值 numpy 数组作为结果?

【问题讨论】:

  • 听起来你在问乘法。
  • 您预期输出中的8s 应该是16s 吗?听起来你想要numpy.packbits。无需相乘和求和。
  • @MateenUlhaq 哈哈哈这太简单了……有时我怎么了:(

标签: python arrays python-3.x numpy


【解决方案1】:

你需要的大概是这样的:

import numpy as np


ar = np.array([[1, 1, 1, 1, 0, 0, 1, 1],
               [1, 1, 1, 1, 0, 0, 1, 1],
               [1, 1, 1, 1, 0, 0, 1, 1],
               [1, 1, 1, 1, 0, 0, 1, 1],
               [1, 1, 1, 1, 0, 0, 1, 1],
               [1, 1, 1, 1, 0, 1, 0, 0],
               [1, 1, 1, 1, 0, 1, 0, 0],
               [1, 1, 1, 1, 0, 1, 0, 0]])

np.packbits(ar, axis=-1)

结果:

array([[243],
       [243],
       [243],
       [243],
       [243],
       [244],
       [244],
       [244]], dtype=uint8)

【讨论】:

    【解决方案2】:

    这是一种方式。它之所以有效,是因为 numpy 隐式广播。

    import numpy as np
    
    mask = np.array([[1, 1, 1, 1, 0, 0, 1, 1],
                     [1, 1, 1, 1, 0, 0, 1, 1],
                     [1, 1, 1, 1, 0, 0, 1, 1],
                     [1, 1, 1, 1, 0, 0, 1, 1],
                     [1, 1, 1, 1, 0, 0, 1, 1],
                     [1, 1, 1, 1, 0, 1, 0, 0],
                     [1, 1, 1, 1, 0, 1, 0, 0],
                     [1, 1, 1, 1, 0, 1, 0, 0]])
    
    arr = np.array([128,  64,  32,  16,   8,   4,   2,   1])
    
    arr2 = arr * mask
    
    # array([[128,  64,  32,  16,   0,   0,   2,   1],
    #        [128,  64,  32,  16,   0,   0,   2,   1],
    #        [128,  64,  32,  16,   0,   0,   2,   1],
    #        [128,  64,  32,  16,   0,   0,   2,   1],
    #        [128,  64,  32,  16,   0,   0,   2,   1],
    #        [128,  64,  32,  16,   0,   4,   0,   0],
    #        [128,  64,  32,  16,   0,   4,   0,   0],
    #        [128,  64,  32,  16,   0,   4,   0,   0]])
    

    【讨论】:

      【解决方案3】:

      这是一种快速而肮脏的方式。

      import numpy as np
      
      ar = np.array([[1, 1, 1, 1, 0, 0, 1, 1],
                     [1, 1, 1, 1, 0, 0, 1, 1],
                     [1, 1, 1, 1, 0, 0, 1, 1],
                     [1, 1, 1, 1, 0, 0, 1, 1],
                     [1, 1, 1, 1, 0, 0, 1, 1],
                     [1, 1, 1, 1, 0, 1, 0, 0],
                     [1, 1, 1, 1, 0, 1, 0, 0],
                     [1, 1, 1, 1, 0, 1, 0, 0]])
      
      
      a = np.array([17, 16, 12, 41, 0, 0, 5, 12])
      for _ in ar:
          m = np.multiply(_, a)
          print(m)
      

      这里我已经打印了这些值,但您可以将它们附加到数组中或随意使用。

      【讨论】:

      • 为什么这比简单的ar*a 更好?
      • @MarkDickinson 我想直接乘法ar*a 是最好的解决方案,但如果你想处理每一行,请对其进行一些操作(如求和),然后将其附加到一个数组中,然后在我的与问题的最后一部分相比,认为这种方法更好
      • 如果您想对每一行求和并将总和累加到一个数组中,您可以使用(ar * a).sum(axis=1)。在使用 NumPy 时,通常最好避免显式的 for 循环。
      猜你喜欢
      • 2021-10-13
      • 2012-10-08
      • 2021-05-18
      • 2015-01-21
      • 1970-01-01
      • 2018-12-30
      • 2014-02-13
      • 2020-09-18
      • 2020-04-18
      相关资源
      最近更新 更多