python - 向量化对角矩阵数组的创建,
问题描述
我有一个称为对角线的二维数组,其中每一行代表二维矩阵的对角线。创建 3d 数组 diag_matricies 的最快/最佳方法是什么,其中最后两个维度均由使用对角线行创建的对角线矩阵组成?
在一个循环中,这就是我想要的:
import numpy as np
diag_matricies = np.zeros([3,3,3])
diagonals = np.array([[1,2,3],[4,5,6],[7,8,9]])
for i in range(3):
diag_matricies[i] = np.diag(diagonals[i,:])
print(diag_matricies)
解决方案
一种更快的替代方法是使用高级索引:
index = np.arange(3)
diag_matricies[:, index, index] = diagonals
[[[1. 0. 0.]
[0. 2. 0.]
[0. 0. 3.]]
[[4. 0. 0.]
[0. 5. 0.]
[0. 0. 6.]]
[[7. 0. 0.]
[0. 8. 0.]
[0. 0. 9.]]]
每个维度大小为1200的时序:
from datetime import datetime
N = 1200
diag_matricies = np.zeros([N, N, N])
diagonals = np.arange(N * N).reshape((N, N))
start = datetime.now()
index = np.arange(N)
diag_matricies[:, index, index] = diagonals
print('advanced indexing: ', datetime.now() - start)
start = datetime.now()
for i in range(N):
diag_matricies[i] = np.diag(diagonals[i])
print('for loop: ', datetime.now() - start)
# advanced indexing: 0:00:01.537120
# for loop: 0:00:07.281833
推荐阅读
- liquibase - 具有除 .sql 之外的其他扩展名的格式化 SQL 变更日志
- javascript - 存储动态创建的控件的值
- awk - 如何用bash在短时间内选择大文件中的有用信息
- xamarin - 如何在 Xamarin 表单应用程序中使用来自 salesforce 的 ServiceCore 框架?
- python - 在 tkinter 的下拉菜单/弹出菜单中添加检查按钮,动态输入以列表的形式出现
- python - IPython 中的常量名称错误
- python - 如何从 Django CharField 解码错误的编码“b'\\xc3\\xb1'”
- python - 在 sklearn.metrics.f1_score 中使用标签参数
- python - 有没有办法在 Python 中生成列表字符串,而无需任何其他 3rd 方包?
- ios - 3000x3000px img with 100% width on mobile Safari/iOS 说 img height 仍然是 3000px