【发布时间】:2017-06-17 13:41:14
【问题描述】:
我有一些小的对称矩阵,它们是较大对称矩阵的低维表示。我有一个向量,它是显示高 D 矩阵的哪些单元应链接到低 D 矩阵中的哪些单元的关键。
我想通过用低维矩阵中的对应值填充较大的矩阵来重新创建这些较大的矩阵。我相信应该有一个矢量化的方法来解决这个问题,但到目前为止,我所能想到的只是一个简单的嵌套 for 循环,这对于这些矩阵(10k+ 行和列)来说速度非常慢。
在这个玩具示例中,key 是 vec1,低维矩阵是 source_mat,高维矩阵是 target_mat。我需要创建 target_mat ,其中每个单元格都根据 key 填充 source_mat 中的相应值。
import pandas as pd
import numpy as np
import random
vec1=[]
for x in range (0, 100):
vec1.append(random.randint(0, 19)) #creating the key
vec1=pd.DataFrame(vec1)
sizevec1=vec1.shape[0]
matshape=(sizevec1,sizevec1)
target_mat=np.zeros(matshape) #key and target have same shape
target_mat=pd.DataFrame(target_mat)
temp=np.random.random((20,20))
source_mat=temp*temp.T
for row in range(0,target_mat.shape[0]):
for column in range(0,target_mat.shape[1]):
print 'row is ', row
print 'column is', column
target_mat.iloc[row,column] = source_mat.item(int(vec1.iloc[row]), int(vec1.iloc[column]))
【问题讨论】:
-
如果您在 Windows 上运行 Python 3.5,您发布的答案对您来说不够快,我可以将其编译为 Cython 程序并让编译器优化每个循环。然后你可以将它作为一个函数导入来调用它,它会更快。
-
感谢@Matt - 当我在大规模数据上尝试我的答案时,它仍然不够快。不幸的是,我在 Mac 和 Linux 服务器上运行 2.7,但 cython 方法听起来很有希望。想知道是否有办法使用地图函数来矢量化整个操作。
-
当我回到我的电脑时,我会看看我的虚拟盒子是否可以处理代码。在 Linux 上,它转到 gcc,虽然这更棘手,因为我的工作环境都是 Windows。尽管如此,当您使用 Cython 编译普通 Python 函数时,如果可能的话,编译器会将循环折叠为矢量化版本,这肯定会提高性能
-
听起来不错!请随时通知我。如果我也遇到一种矢量化方法,我会发布。
-
我首先要做的是在 Windows 上使用 Cython 进行编译,因为我的构建环境已经设置好,看看会带来什么样的速度提升。我们还将 BP 的所有内容迁移到 Linux Amazon 实例,因此如果看起来不错,我将尝试设置 Linux GCC 构建,但这可能需要一些时间。至少您会对 c++ 编译器及其继承的循环优化可以提高哪些速度有所了解。
标签: python matrix indexing vectorization dimensionality-reduction