将 16 位无符号整数数组转换为位的快速方法
fast way to convert array of 16 bit unsigned interger to bits
我有一个大型数据集,其中包含一个 16 位无符号整数的 3d 数组。我想将每个整数转换为位,然后只保留其 8:12 位为“0000” 到目前为止,我在三个阶段使用非常慢的循环方法:
import numpy as np
# Generate random data
a = np.ones([4,1200,1200], dtype="int16")
# Generate an array which serves later as mask
b = np.zeros(a.shape, dtype=int)
for i in range(4):
for j in range(1200):
for k in range(1200):
b[i,j,k] = int('{:016b}'.format(a[i,j,k])[8:12])
a = np.ma.masked_where(b!=0, a)
如果你能建议我一个干净快速的替代方案,我将不胜感激
你的问题和例子有点令人困惑,但通常如果你想关注某些位,你可以应用二进制 and 运算符 &
和正确的掩码.所以,如果你想在 16 位无符号整数中 select “8:12 位”,那么掩码将是 0b0000000011110000
即 240
.
例如,arr = np.random.randint(0, 2 ** 16 - 1, (6, 6))
,我有
array([[28111, 29985, 2056, 24534, 2837, 49004],
[ 7584, 8798, 38715, 40600, 26665, 51545],
[34279, 8134, 16112, 59336, 15373, 46839],
[ 131, 12500, 11779, 44852, 57627, 50253],
[63222, 60588, 9191, 3033, 18643, 8975],
[17299, 62925, 31776, 10933, 59953, 28443]])
然后 np.ma.masked_where(arr & 240, arr)
产生
masked_array(
data=[[--, --, 2056, --, --, --],
[--, --, --, --, --, --],
[--, --, --, --, 15373, --],
[--, --, 11779, --, --, --],
[--, --, --, --, --, 8975],
[--, --, --, --, --, --]],
mask=[[ True, True, False, True, True, True],
[ True, True, True, True, True, True],
[ True, True, True, True, False, True],
[ True, True, False, True, True, True],
[ True, True, True, True, True, False],
[ True, True, True, True, True, True]],
fill_value=999999)
这与您使用 for
循环得到的结果一致。
我有一个大型数据集,其中包含一个 16 位无符号整数的 3d 数组。我想将每个整数转换为位,然后只保留其 8:12 位为“0000” 到目前为止,我在三个阶段使用非常慢的循环方法:
import numpy as np
# Generate random data
a = np.ones([4,1200,1200], dtype="int16")
# Generate an array which serves later as mask
b = np.zeros(a.shape, dtype=int)
for i in range(4):
for j in range(1200):
for k in range(1200):
b[i,j,k] = int('{:016b}'.format(a[i,j,k])[8:12])
a = np.ma.masked_where(b!=0, a)
如果你能建议我一个干净快速的替代方案,我将不胜感激
你的问题和例子有点令人困惑,但通常如果你想关注某些位,你可以应用二进制 and 运算符 &
和正确的掩码.所以,如果你想在 16 位无符号整数中 select “8:12 位”,那么掩码将是 0b0000000011110000
即 240
.
例如,arr = np.random.randint(0, 2 ** 16 - 1, (6, 6))
,我有
array([[28111, 29985, 2056, 24534, 2837, 49004],
[ 7584, 8798, 38715, 40600, 26665, 51545],
[34279, 8134, 16112, 59336, 15373, 46839],
[ 131, 12500, 11779, 44852, 57627, 50253],
[63222, 60588, 9191, 3033, 18643, 8975],
[17299, 62925, 31776, 10933, 59953, 28443]])
然后 np.ma.masked_where(arr & 240, arr)
产生
masked_array(
data=[[--, --, 2056, --, --, --],
[--, --, --, --, --, --],
[--, --, --, --, 15373, --],
[--, --, 11779, --, --, --],
[--, --, --, --, --, 8975],
[--, --, --, --, --, --]],
mask=[[ True, True, False, True, True, True],
[ True, True, True, True, True, True],
[ True, True, True, True, False, True],
[ True, True, False, True, True, True],
[ True, True, True, True, True, False],
[ True, True, True, True, True, True]],
fill_value=999999)
这与您使用 for
循环得到的结果一致。