有没有办法使用numpy从python中的2D数组构造3D数组?

Posted

技术标签:

【中文标题】有没有办法使用numpy从python中的2D数组构造3D数组?【英文标题】:Is there a way to construct 3D array from 2D array in python using numpy? 【发布时间】:2021-11-09 10:34:22 【问题描述】:

我有一个值是正整数的矩阵,我想使用 numpy 找到解压缩到张量中的位表示

例如

[[1 , 2],
 [3 , 4]]

[[0 , 0],
 [0 , 1]], 

[[0 , 1],
 [1 , 0]],

[[1 , 0],
 [1 , 0]]

【问题讨论】:

二进制张量值的逻辑是什么? 实际上我想将其条目为十进制的二维数组映射为二进制张量。在这种情况下,张量是具有二进制条目的 3 - 2D 数组 张量的深度取决于最大入口的长度,在这种情况下,4 是最大入口,所以 4 等于 100,那么深度是 3 np.unpackbits(x[None,:], axis=0)[-3:] 之类的东西应该可以完成这项工作。 没错,我看过了,但它不支持自定义单位长度。它只适用于unit8 【参考方案1】:

此解决方案仅限于二维数组,但适用于大于 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) & 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) & 2**np.arange(bits)[::-1])

输出

array([[0, 0, 1],
       [0, 2, 0],
       [0, 2, 1],
       [4, 0, 0]])

使用np.where 转换为1,0 bool 数组

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

塑造所需的输出。

【讨论】:

谢谢。这对我来说真的很有用:D

以上是关于有没有办法使用numpy从python中的2D数组构造3D数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Python中搜索Numpy数组中的数字

python使用numpy中的diagonal函数获取2D numpy数组的对角线元素使用numpy中的diagonal函数和sum函数获取2D numpy数组的迹(matrix trace)

python使用numpy中的np.linalg.det函数计算2D numpy数组的行列式的值使用numpy中的np.linalg.inv函数计算2D numpy数组的逆矩阵

如何用生成器中的值填充 2D Python numpy 数组?

基于 2D 数组的 3D numpy 切片的平均值

如何从 2D numpy (lat,lon) 数组中删除扇区/切片?