基于给定比特信息提取Numpy数组的指标

时间:2014-10-18 05:47:07

标签: python arrays numpy bit-manipulation

我的数据采用的是32位无符号整数'如下:

myData = np.array([1073741824, 1073741877, 1073742657, 1073742709, 1073742723, 1073755137, 1073755189,1073755969],dtype=np.uint32)

我想获得' myData'的元素索引。发生以下情况:

Bit No. 0–1
Bit Combination: 00

我该怎么做?

2 个答案:

答案 0 :(得分:3)

您可以使用np.binary_repr()获取表示每个元素的字符串,并从此字符串中获取符合您标准的元素:

end = `00`
s = [np.binary_repr(ai, width=len(end)) for ai in myData]
indices = [i for (i, si) in enumerate(s) if si.endswith(end)]

编辑:矢量化(和推荐)方法

在进一步研究后,我发现在使用数组的np.unpackbits()视图后,您可以使用uint8

myData = myData.view(np.uint32) # not needed if it is already np.uint32
tmp = np.unpackbits(myData.view(np.uint8)[::4][None, :], axis=0)
indices = np.where((tmp[-2, :] == 0) & (tmp[-1, :] == 0))[0]

请注意,切片是根据您要比较的位进行的:

  • [::4]代表前8位
  • [1::4]代表第9至第16位
  • [2::4]代表第17位至第24位
  • [3::4]第25位到第32位
例如,如果原始数据类型为np.uint64,则此序列可以继续显示,但在这种情况下使用[n::8]代替。

答案 1 :(得分:1)

我会说这是规范的方式:

np.flatnonzero((a & 0b11) == 0)

即。屏蔽掉除最后两个之外的所有位并获得全部为零的索引。

这是短暂的,快速的,并且不会对字节序做出任何假设。