Подсчет изменяющихся битов в массиве numpy - PullRequest
0 голосов
/ 09 декабря 2018

Я делаю свои первые шаги с Python3, поэтому я не уверен, как решить следующую задачу.Я хотел бы посчитать, как часто каждый бит в массиве меняется со временем, мой массив выглядит следующим образом:

first column: timestamp;второй столбец: 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;второй столбец # 65 (количество изменений бит64, количество изменений бит63, ... количество изменений бит1, количество изменений бит0)

Таким образом, в этом коротком примере должен быть массив результатов с 3 строками (ID144, ID1428 и ID1680) и 65 столбцов.

Знаете ли вы, как этого добиться?

1 Ответ

0 голосов
/ 10 декабря 2018

Первым шагом обязательно удалите столбцы «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])

Это массив (64,), соответствующий ID=144.Чтобы получить результат (3, 64), объедините три результата, например:

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