【发布时间】:2016-02-20 21:30:12
【问题描述】:
我用 Python 写了一些代码,运行良好但速度很慢;我认为由于 for 循环。我希望可以使用 numpy 命令加快以下操作。让我定义目标。
假设我有一个二维 numpy 数组 all_CMs,维度为 row x col。例如考虑一个6x11 数组(见下图)。
我想计算所有行的平均值,即 sumⱼ aᵢⱼ 得到一个数组。当然,这很容易做到。 (我把这个值称为
CM_tilde)现在,对于 每一行,我想计算一些选定值的平均值,即所有低于某个阈值的值,方法是计算它们的总和并将其除以所有列的数量 (
N)。如果该值高于此定义的阈值,则添加CM_tilde值(整行的平均值)。这个值叫做CM然后,从行中的每个元素中减去
CM值
除此之外,我还想要一个 numpy 数组或列表,其中列出了所有 CM 值。
图:
以下代码可以运行,但速度很慢(尤其是在数组变大的情况下)
CM_tilde = np.mean(data, axis=1)
N = data.shape[1]
data_cm = np.zeros(( data.shape[0], data.shape[1], data.shape[2] ))
all_CMs = np.zeros(( data.shape[0], data.shape[2]))
for frame in range(data.shape[2]):
for row in range(data.shape[0]):
CM=0
for col in range(data.shape[1]):
if data[row, col, frame] < (CM_tilde[row, frame]+threshold):
CM += data[row, col, frame]
else:
CM += CM_tilde[row, frame]
CM = CM/N
all_CMs[row, frame] = CM
# calculate CM corrected value
for col in range(data.shape[1]):
data_cm[row, col, frame] = data[row, col, frame] - CM
print "frame: ", frame
return data_cm, all_CMs
有什么想法吗?
【问题讨论】:
-
在第 2 步中,您是否实质上将任何高于阈值的值替换为 CM_tilde,然后然后计算整行的平均值,包括替换的值?跨度>
-
首先使用
np.where替换您的内部 for 循环。然后,使用广播,您可以删除外部 2 个循环。请参阅where的文档
标签: python numpy vectorization