【发布时间】:2015-06-12 09:21:48
【问题描述】:
这个问题更侧重于计算的性能。
我有 2 个列数相同但行数不同的矩阵。一个矩阵是“模式”,其行必须分别与其他矩阵行(所有行)进行比较,然后才能提取平均值的统计值等于模式、标准、... 所以,我有以下矩阵,计算如下:
numCols = 10
pattern = np.random.randint(0,2,size=(7,numCols))
matrix = np.random.randint(0,2,size=(5,numCols))
comp_mean = np.zeros(pattern.shape[0])
for i in range(pattern.shape[0]):
comp_mean[i] = np.mean(np.sum(pattern[i,:] == matrix, axis=1))
print comp_mean # Output example: [ 1.6 1. 1.6 2.2 2. 2. 1.6]
这很清楚。问题是两者的矩阵行数都大得多(~1.000.000)。所以这段代码很慢。我尝试实现 numpy 语法,因为有时它会令我惊讶地改进计算时间。所以我做了以下代码(它可能很奇怪,但它有效!):
comp_mean = np.mean( np.sum( (pattern[np.repeat(np.arange(pattern.shape[0]), matrix.shape[0])].ravel() == np.tile(matrix.ravel(),pattern.shape[0])).reshape(pattern.shape[0],matrix.shape[0],matrix.shape[1]), axis=2 ),axis=1)
print comp_mean
但是,此代码比使用“for”扣环的前一个代码要慢。所以我想知道是否有可能加快计算速度。
编辑
我检查了实矩阵的不同方法的运行时间,结果如下:
- 我 - 方法 1:18.04 秒
- 我 - 方法 2:303.10 秒
- Divakar - 方法 1:18.79 秒
- Divakar - 方法 2:65.11 秒
- Divakar - 方法 3.1:137.78 秒
- Divakar - 方法 3.2:59.59 秒
- Divakar - 方法 4:6.06 秒
编辑(2)
以前在笔记本电脑上执行的运行。我已经在桌面上运行了代码。我已经避免了最坏的结果,并且新的运行时现在不同了:
- 我 - 方法 1:6.25 秒
- Divakar - 方法 1:4.01 秒
- Divakar - 方法 2:3.66 秒
- Divakar - 方法 4:3.12 秒
【问题讨论】:
-
pattern有多大? -
@Divakar,对于暴露的运行时测试,模式编号行 100.000 和矩阵 1.000 行。
-
查看添加的方法#4?
-
@Divakar 您的最后一种方法具有最佳性能。您是否认为还有可能走得更远,或者正如您所说,矩阵太大最好坚持使用 for 循环?我将在内存大的机器上尝试相同的代码,以检查这是否会成为计算瓶颈
-
看看它在高端机器上的表现肯定会很有趣。对于矢量化代码和庞大的数据量,总是存在这种争斗,特别是当操作是归约时。稍作修改以接近 #4,尽管我怀疑不会产生巨大影响。
标签: python performance numpy matrix comparison