【问题标题】:Get bit on n position from all elements in ndarray in python从python数组中的所有元素中获取n位置的位
【发布时间】:2014-03-11 10:01:01
【问题描述】:

我有一个int32 的 3D 数组。我想将每个项目从数组转换为“n”个位置上的相应位值。我目前的做法是循环遍历整个数组,但我认为这样做效率更高。

for z in range(0,dim[2]):
 for y in range(0,dim[1]):
  for x in range(0,dim[0]):
   byte='{0:032b}'.format(array[z][y][x])
   array[z][y][x]=int(byte>>n) & 1

期待您的回答。

【问题讨论】:

  • 顺便说一句,如果你想要n-th 位,你需要右移n-1 位置

标签: python arrays bit bitmask


【解决方案1】:

如果您正在处理大型数组,最好使用numpy。在 numpy 数组上应用按位运算比在 python 列表上应用要快得多。

import numpy as np
a = np.random.randint(1,65, (2,2,2))

print a
Out[12]: 
array([[[37, 46],
        [47, 34]],

       [[ 3, 15],
        [44, 57]]])
print (a>>1)&1
Out[16]: 
array([[[0, 1],
        [1, 1]],

       [[1, 1],
        [0, 0]]])

【讨论】:

    【解决方案2】:

    除非不同点之间存在内在关系,否则您别无选择,只能遍历它们以发现它们的当前值。所以你能做的最好的永远是O(n^3)

    然而,我不明白的是,为什么您要费力地将数字转换为 32 位字符串,然后再转换回 int。

    如果要检查数字的第 n 位是否已设置,您可以执行以下操作:

    power_n = 1 << (n - 1)
    for z in xrange(0,dim[2]):
     for y in xrange(0,dim[1]):
      for x in xrange(0,dim[0]):
       array[z][y][x]= 0 if array[z][y][x] & power_n == 0 else 1
    

    不是在这个例子中,我假设 N 是一个 1 索引(第一位在 n=1 处)。

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多