python - numpy - 张量乘积
问题描述
我有一个 4 x 4 矩阵
import numpy as np
c = np.random.rand((4,4))
我想创建一个 100 x 4 x 4 x 100 张量,这样当第一个和最后一个索引相等时,我得到我的矩阵,否则我得到零。
我可以循环执行此操作
Z = np.zeros((100, 4, 4, 100))
for i in range(100):
Z[i, :, :, i] = c
有一个更好的方法吗?我尝试查看 np.tensordot 和 np.einsum 但无法弄清楚。
谢谢, 萨希尔
解决方案
n = 100
Zout = np.zeros((n, 4, 4, n))
I = np.arange(n)
Zout[I,:,:,I] = c
与eye-masking
-
n = 100
mask = np.eye(n, dtype=bool)
Zout = np.zeros((n, 4, 4, n))
Zout.transpose(0,3,1,2)[mask] = c
计时 -
In [72]: c = np.random.rand(4,4)
In [73]: %%timeit
...: n = 100
...: Zout = np.zeros((n, 4, 4, n))
...: I = np.arange(n)
...: Zout[I,:,:,I] = c
10000 loops, best of 3: 47.5 µs per loop
In [74]: %%timeit
...: n = 100
...: mask = np.eye(n, dtype=bool)
...: Zout = np.zeros((n, 4, 4, n))
...: Zout.transpose(0,3,1,2)[mask] = c
10000 loops, best of 3: 73.1 µs per loop
推荐阅读
- python - 是否可以将 Python 代码与从 Node JS 启动的 Pytorch 一起使用?
- visual-studio-2017 - 录制的视频所在的单元测试
- c++ - Linux 内存映射文件消耗的磁盘比预期的要多
- python - 我们可以在“set”,“list”和“tuple”上使用python中的特殊方法吗?
- android - 将 admob 原生广告添加到回收站视图后,Android 获得正确的项目位置
- python - 如何使用 Python Cryptography 在没有后端(或使用什么后端)的情况下加载 der 证书
- java - Java SSHJ 库和启用日志记录
- mysql - SQL查询日期时间选择24小时前
- c - 在 C 中为多个变量定义条件时出现问题
- uwp - 如何防止我的 UWP 应用全屏显示?