簡體   English   中英

將 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)

如果你能建議我一個干凈和快速的替代方案,我將不勝感激

您的問題和示例有點令人困惑,但通常如果您想專注於某些位,您可以應用二進制運算符&並使用正確的掩碼。 因此,如果您想在 16 位無符號整數中選擇“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循環得到的結果一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM