Python Numpy中的映射
给定一个3d numpy数组,我想提取数字的2个最低有效位: 例如,让Python Numpy中的映射,python,arrays,list,numpy,bit-manipulation,Python,Arrays,List,Numpy,Bit Manipulation,给定一个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
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]),两个LSB分别为10,11和00。
然后将其连接在一起,形成101100,十进制为44。目标是为给定数组中的每个“像素”创建一个数字列表
我想对数组中的每个“像素”使用numpy操作,而不使用for循环 该位屏蔽了较低的两位,然后将每个三元组移位,然后求和:
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)
我相信它可以做得更好,但这确实得到了要求的结果。此位屏蔽了较低的两位,然后将每个三元组移位,然后求和:
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)
我相信它可以做得更好,但这确实得到了要求的结果。为什么没有for循环?有没有试过?@0xc0de:for在NumPy数组上循环比使用其他方法要慢得多。我同意。我想这是一个编程练习,如果OP也能考虑一下,那为什么没有for循环呢?有没有试过?@0xc0de:for在NumPy数组上循环比使用其他方法要慢得多。我同意。我想这是一些编程练习,如果OP也考虑一下的话,我会得到
ValueError:“axis”条目超出了范围。。。。另外,我还必须修正一个打字错误。是的,它与print((np.array(img)和0b11)一起工作。实际上我的坏,我有来自未来的导入打印功能默认情况下可以生成np.array([4,2,0])
通过np.arange(3)[:-1]*2
。或者np arange(5)[:-2]
。我得到了ValueError:“axis”条目超出了范围。
我还必须修正一个打字错误。是的,它可以使用print(((np.array(img)和0b11)实际上我的错误,我有来自未来的导入打印功能默认情况下,
可以通过np.arange(3)[:-1]生成np.array([4,2,0])
*2
或np.arange(5)[::-2]
。