【问题标题】:Mapping in NumpyNumpy 中的映射
【发布时间】:2017-04-07 05:23:40
【问题描述】:

给定一个 3d numpy 数组,我想提取数字的 2 个最低有效位:

例如,让

img = [[[30, 31, 32],
    [33, 34, 35],
    [36, 37, 38],
    [39, 40, 41],
    [42, 43, 44]],

   [[45, 46, 47],
    [48, 49, 50],
    [51, 52, 53],
    [54, 55, 56],
    [57, 58, 59]]]

其中每个像素[30,31,32]或[33,34,35]...等,分别代表R,G,B值

我想提取 2 个最低有效位并将这些数字连接起来以创建一个 6 位数字。

对于 ([30, 31, 32]),2 个 LSB 将分别为 10、11 和 00。 然后将其连接在一起形成 101100,即十进制的 44。目标是为给定数组中的每个“像素”制作一个数字列表。

我想对使用 numpy 操作且不使用 for 循环的数组中的每个“像素”执行此操作。

【问题讨论】:

  • 为什么没有 for 循环?你试过什么?
  • @0xc0de:在 NumPy 数组上进行 for 循环与使用它们的其他方式相比非常非常慢。
  • 我同意。我想这是一些编程练习,如果 OP 也考虑一下。

标签: python arrays list numpy bit-manipulation


【解决方案1】:

这个位屏蔽了低两位,然后将每个三倍移动,然后将它们相加:

img = [[[30, 31, 32],
    [33, 34, 35],
    [36, 37, 38],
    [39, 40, 41],
    [42, 43, 44]],

   [[45, 46, 47],
    [48, 49, 50],
    [51, 52, 53],
    [54, 55, 56],
    [57, 58, 59]]]

import numpy as np

print ((np.array(img) & 0b11) << np.array([4,2,0])).sum(axis=2)

哪些打印:

[[44 27  6 49 44]
 [27  6 49 44 27]]

我确信它可以做得更好,但这确实得到了要求的结果。

【讨论】:

  • 我得到了ValueError: 'axis' entry is out of bounds 这个......我还必须修正一个错字。
  • 是的,它适用于print(((np.array(img) &amp; 0b11) &lt;&lt; np.array([4,2,0])).sum(axis=2))。位操作做得很好。
  • 其实我的错,我默认有from __future__ import print_function
  • 可以通过np.arange(3)[::-1] * 2生成np.array([4,2,0])
  • np.arange(5)[::-2]
猜你喜欢
  • 1970-01-01
  • 2013-11-07
  • 2019-03-31
  • 2011-10-13
  • 2021-08-05
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多