簡體   English   中英

計算numpy數組中的更改位

[英]Count changing bits in numpy array

我正在使用Python3做我的第一步,所以我不確定如何解決以下任務。 我想計算一個numpy數組中每個位隨時間變化的頻率,我的數組如下所示:

第一列:時間戳記; 第二列:ID; 第三列至最后一列:byte8,...,byte2,byte1,byte0(每字節8位)

[[0.009469 144 '00001001' ... '10011000' '00000000' '00000000']
 [0.01947 144 '00001000' ... '10011000' '00000000' '00000001']
 [0.029468 144 '00001001' ... '10011000' '00000000' '00000011']
 ...
 [0.015825 1428 '11000000' ... '01101101' '00000000' '00000001']
 [0.115823 1428 '11000000' ... '01101100' '00000000' '00000000']
 [0.063492 1680 '01000000' ... '00000000' '00000000' '00000000']]

任務是計算一段時間內每個ID的位變化。 結果應如下所示(時間戳可以忽略):

每個ID包含一行:

第一欄:ID; 次於列#65(更改數bit64,更改數bit63,...更改數bit1,更改數bit0)

因此,在這個簡短的示例中,應該有一個包含3行(ID144,ID1428和ID1680)和65列的結果數組。

你知道如何做到這一點嗎?

第一步絕對是刪除“ timestamp”和“ ID”列,並確保其不是string類型。 我不認為您可以擁有一個看起來像您的示例的numpy數組(復合dtype除外,這會使事情變得復雜)。 對於“ ID”,應將不同的“ ID”分隔到不同的數組,例如:

a = yourArray[yourArray[1]==144]
b = yourArray[yourArray[1]==1428]
c = yourArray[yourArray[1]==1680]

由於我沒有您的數據,因此我將在此處制作一些隨機數據:

a = np.random.randint(0, 256, (16, 8), 'B')

a應該看起來像:

array([[ 46,  74,  78,  41,  46, 173, 188, 157],
       [164, 199, 135, 162, 101, 203,  86, 236],
       [145,  32,  40, 165,  47, 211, 187,   7],
       [ 90,  89,  98,  61, 248, 249, 210, 245],
       [169, 116,  43,   6,  74, 171, 103,  62],
       [168, 214,  13, 173,  71, 195,  69,   8],
       [ 33,   1,  38, 115,   1, 111, 251,  90],
       [233, 232, 247, 118, 111,  83, 180, 163],
       [130,  86, 253, 177, 218, 125, 173, 137],
       [227,   7, 241, 181,  86, 109,  21,  59],
       [ 24, 204,  53,  46, 172, 161, 248, 217],
       [132, 122,  37, 184, 165,  59,  10,  40],
       [ 85, 228,   6, 114, 155, 225, 128,  42],
       [229,   7,  61,  76,  31, 221, 102, 188],
       [127,  51, 185,  70,  17, 138, 179,  57],
       [120, 118, 115, 131, 188,  53,  80, 208]], dtype=uint8)

之后,您可以簡單地:

abs(np.diff(np.unpackbits(a, 1).view('b'), axis=0)).sum(0)

獲取與每個位對應的行方向上的更改數:

array([ 7,  9,  7,  7,  9, 12, 10,  6,  7,  8,  8,  7,  7,  6,  7,  9,  8,
        7, 11,  9,  8,  7,  5,  7,  7,  9,  6,  9,  8,  7,  9,  7,  6, 10,
        8, 12,  5,  5,  5,  9,  7,  9,  8, 12,  9,  8,  5,  5,  5,  8, 10,
       10,  7,  6,  7,  8,  7,  8,  5,  5, 11,  7,  6,  8])

這是一個對應於ID=144的形狀(64,)數組。 要生成結果(3, 64) 3,64 (3, 64) ,請合並三個結果,例如:

np.array((aResult, bResult, cResult))

暫無
暫無

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

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