我正在使用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列的结果数组。
您知道如何实现吗?
答案 0 :(得分:0)
第一步绝对是删除“时间戳”和“ 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])
这是与(64,)
相对应的形状ID=144
数组。要生成结果(3, 64)
,请合并三个结果,例如:
np.array((aResult, bResult, cResult))