首页 文章

计数numpy数组中的更改位

提问于
浏览
1

我正在用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,更改位数63,...更改位数1,更改位数bit0)

所以在这个简短的例子中,应该有一个包含3行(ID144,ID1428和ID1680)和65列的结果数组 .

你知道怎么做到这一点吗?

1 回答

  • 0

    第一步肯定是删除"timestamp"和"ID"列,并确保它不是 string 类型 . 我不认为你 can 有一个看起来像你的例子的 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) ,连续三个结果如下:

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

相关问题