#python #arrays #numpy #binary #tensor
Вопрос:
У меня есть матрица, значения которой являются целыми положительными числами, и я хочу найти битовое представление, распакованное в тензор, используя numpy
например
[[1 , 2],
[3 , 4]]
Для
[[0 , 0],
[0 , 1]],
[[0 , 1],
[1 , 0]],
[[1 , 0],
[1 , 0]]
Комментарии:
1. Какова логика значений двоичного тензора?
2. На самом деле я хочу отобразить 2D-массив, в котором его записи являются десятичными, в двоичный тензор. В этом случае тензор представляет собой 3 — 2D массивы с двоичными записями
3. глубина тензора зависит от длины максимального входа , в данном случае 4-это максимальный вход, поэтому 4 равно 100, тогда глубина равна 3
4. Что-то вроде
np.unpackbits(x[None,:], axis=0)[-3:]
того, что должно сделать эту работу.5. Правильно, я посмотрел его, но он не поддерживает пользовательскую длину единицы измерения. это просто работает с unit8
Ответ №1:
Это решение ограничено 2D-массивами, но работает с элементами размером больше np.uint8
и вычисляет необходимую разрядность.
import numpy as np
M = np.array([[1,2],
[3,4]])
bits = int(np.log2(M.max())) 1
(np.where(
M.reshape(-1,1) amp; 2**np.arange(bits)[::-1], 1, 0)
.reshape(*M.shape, -1)
.transpose(2,0,1))
Выход
array([[[0, 0],
[0, 1]],
[[0, 1],
[1, 0]],
[[1, 0],
[1, 0]]])
Как это работает
Постройте диапазон со степенями 2
2**np.arange(bits)[::-1]
Транслируйте этот диапазон с logical_and
помощью входных элементов
(M.reshape(-1,1) amp; 2**np.arange(bits)[::-1])
Выход
array([[0, 0, 1],
[0, 2, 0],
[0, 2, 1],
[4, 0, 0]])
Преобразуйте в 1
0
массив bool с помощью np.where
array([[0, 0, 1], # 1 in binary
[0, 1, 0], # 2 in binary
[0, 1, 1], # 3 in binary
[1, 0, 0]]) # 4 in binary
Сформируйте желаемый результат.
Комментарии:
1. Спасибо. Это действительно полезно для меня 😀