有没有办法使用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,那么深度是 3np.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中的diagonal函数获取2D numpy数组的对角线元素使用numpy中的diagonal函数和sum函数获取2D numpy数组的迹(matrix trace)
python使用numpy中的np.linalg.det函数计算2D numpy数组的行列式的值使用numpy中的np.linalg.inv函数计算2D numpy数组的逆矩阵