#python #python-3.x #pandas #numpy
#python #python-3.x #pandas #numpy
Вопрос:
У меня есть один массив, подобный [4, 255, 16]
, с dtype = int8
. Я хочу повернуть его влево, но как двоичный поворот.
Я хочу, чтобы мой массив был таким, как описано ниже:
000001001111111100010000
После поворота влево на 2 бита, это будет:
000100111111110001000000
В десятичном виде [17, 252, 64]
Комментарии:
1. Вы уже что-нибудь пробовали? Всегда лучше, когда у нас есть некоторый код в качестве отправной точки.
2. Не должно
000100111111110001000000
быть[19, 252, 64]
?
Ответ №1:
Вы можете использовать deque
from collections
, если хотите его красиво повернуть,
>>> from array import array
>>> from collections import deque
>>> x = array('l', [4, 255, 16])
>>> x
array('l', [4, 255, 16])
>>> z = ''.join([format(y, 'b').zfill(8) for y in x.tolist()])
>>> z
'000001001111111100010000'
>>> d = deque(z)
>>> d.rotate(-2)
>>> ''.join(d)
'000100111111110001000000'
>>> k = ''.join(d)
>>> [int(k[i:i 8],2) for i in range(0, len(k), 8)]
[19, 252, 64]
Комментарии:
1. Зачем использовать
array
?z = ''.join([format(y, 'b').zfill(8) for y in x])
ifx= [4, 255, 16]
работает просто отлично.2. @DavidBuck Я просто хотел показать пользователю, есть ли у него уже
array
. И вопрос, начатый с,I have one array like [4, 255, 16], with dtype = int8
. Чтоarray.array('l', [4, 255, 16])
🙂3. Спасибо за интересные ответы. Хотя, можно ли удалить
.tolist()
?4. @GrijeshChauhan Уверен, он мог бы просто начать с простого
list
Ответ №2:
Вы хотите повернуть массив так, как если бы это было одно длинное целое число.
Приведенное ниже решение преобразует массив в одно длинное целое число, которое является просто Python int
, поворачивает его с помощью побитовой арифметики, затем записывает его обратно в массив.
Код
from array import array
def shift_left(arr, shift=1):
if not arr:
return
long = 0
itemsize = arr.itemsize * 8
bit_length = len(arr) * itemsize
item_bits = (1 << itemsize) - 1
bits = (1 << bit_length) - 1
# Convert the array to a long integer
for i, x in enumerate(reversed(arr)):
long |= x << (i * itemsize)
# Left part of the | shifts the long left and drops the overflow
# Right part of the | adds the last bits at the start of the long
long = (long << shift amp; bits) | long >> (bit_length - shift)
# Write back the long integer in the array
for i in range(1, len(arr) 1):
arr[-i] = long amp; item_bits
long >>= itemsize
Пример
arr = array('B', [4, 255, 16])
shift_left(arr, shift=2)
print(arr)
Вывод
array('B', [19, 252, 64])