Есть ли способ построить 3D-массив из 2D-массива в python с помощью numpy?

#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. Спасибо. Это действительно полезно для меня 😀