提高元素块之间差异的性能

时间:2018-01-26 22:03:15

标签: python performance numpy

我有一个相当简单的块,它可以获得两个数组中两个选定元素之间的绝对值差异。

import numpy as np

# Input data with proper format.
N_bb, N_cc = np.random.randint(1e5), np.random.randint(1e5)
bb = np.random.uniform(0., 1., N_bb)
cc = np.random.uniform(0., 1., N_cc)

# My actual code repeats this process ~500 times.
all_ds = []
for _ in range(500):

    # An index into cc for each element in bb.
    idx_into_cc = np.random.randint(0, len(cc), len(bb))

    # This is the block I need to make faster.
    aa = []
    for i, b in enumerate(bb):
        aa.append(abs(b - cc[idx_into_cc[i]]))
    d = np.median(aa)

    # Use 'd' before the next iteration, and store the result.
    all_ds.append(some_func(d))

我使用绝对差异,因为我需要正值,我也可以使用平方差。 bbcc数组在整个过程中保持不变,但每次迭代时idx_into_cc都会发生变化。

如何改善此代码的性能?

1 个答案:

答案 0 :(得分:3)

我们可以简单地使用矢量化索引来删除内部循环,就像这样 -

d = np.median(np.abs(bb-cc[idx_into_cc]))