我有一个np.array
的np.uint8
a = np.array([randint(1,255) for _ in range(100)],dtype=np.uint8)
我想把它分为低分和高分
我可以得到低的一点
^{pr2}$我可以用
high = np.bitwise_and(np.right_shift(a,4),0xF)
有什么方法可以像
>>> numpy.keep_bits(a,[(0,3),(4,7)])
numpy.array([
[low1,high1],
[low2,high2],
...
[lowN,highN]
])
我甚至不知道这叫什么。。。但我想也许一些裸体大师会知道一个很酷的方法来做到这一点(事实上,我正期待着用uint32和更多种类的啃咬来做到这一点)
基本上类似于struct.unpack
,但用于矢量化numy操作
编辑:我使用了下面接受答案的修改版本
这是我的最终代码,供感兴趣的人使用
def bitmask(start,end):
"""
>>> bitmask(0,2) == 0b111
>>> bitmask(3,5) == 0b111000
:param start: start bit
:param end: end bit (unlike range, end bit is inclusive)
:return: integer bitmask for the specified bit pattern
"""
return (2**(end+1-start)-1)<<start
def mask_and_shift(a,mask_a,shift_a):
"""
:param a: np.array
:param mask_a: array of masks to apply (must be same size as shift_a)
:param shift_a: array of shifts to apply (must be same size as mask_a)
:return: reshaped a, that has masks and shifts applied
"""
masked_a = numpy.bitwise_and(a.reshape(-1,1), mask_a)
return numpy.right_shift(masked_a,shift_a)
def bit_partition(rawValues,bit_groups):
"""
>>> a = numpy.array([1,15,16,17,125,126,127,128,129,254,255])
>>> bit_partition(a,[(0,2),(3,7)])
>>> bit_partition(a,[(0,2),(3,5),(6,7)])
:param rawValues: np.array of raw values
:param bit_groups: list of start_bit,end_bit values for where to bit twiddle
:return: np.array len(rawValues)xlen(bit_groups)
"""
masks,shifts = zip(*[(bitmask(s,e),s) for s,e in bit_groups])
return mask_and_shift(rawValues,masks,shifts)
因此,我不想评论您想要实现的特定逻辑运算符,因为位黑客攻击并不是我的专长,但是我可以告诉您您应该在
numpy
中查找以实现这种自定义运算符。在如果您浏览
numpy
源代码,您会注意到numpy
中几乎所有的位编译技术都只是_MaskedBinaryOperation
的实例,例如,bitwise_and
的定义很简单:这里的魔力是以
umath
模块的形式出现的,该模块通常调用numpy
所基于的低级库。如果你真的想的话,你可以在那里加上你的接线员,但我认为不值得在这个级别上胡闹。在也就是说,这并不是将这些函数合并到
^{pr2}$numpy
中的唯一方法。事实上,umath
模块有一个非常方便的函数,名为frompyfunc
,它可以让您将任意python函数转换为这些方便的umath
运算符之一。文档可以找到here。创建此类函数的示例如下:如果您决定要实现的按位运算符的细节,则使用此接口将是实现它的最佳方法。在
这并不能百分之百地回答您的问题,但我假设您的问题更多的是以适当的
numpy
形式实现一些自定义的位运算符,而不是深入研究位运算符本身。如果这是不准确的,请告诉我,我可以用你上面提到的位运算符来做一个例子。在使用广播的一行程序,用于四位低位和高位半字节:
为了推广这一点,将硬编码值}替换为适当的位掩码和移位。例如,要将值分成三组,其中包含最高的两个位,然后是剩下的两组三位,可以执行以下操作:
^{pr2}$[0xF, 0xF0]
和{相关问题 更多 >
编程相关推荐