向量化numpy数组扩展


问题内容

我试图找到一种向量化操作的方法,其中我采用1个numpy数组并将每个元素扩展为4个新点。我目前正在使用Python循环进行此操作。首先让我解释一下算法。

input_array = numpy.array([1, 2, 3, 4])

我想将该数组中的每个元素“扩展”或“扩展”到4点。因此,元素零(值1)将扩展为以下4个点:

[0, 1, 1, 0]

对于每个元素,最终的最终数组都是这样:

[0, 1, 1, 0, 0, 2, 2, 0, 0, 3, 3, 0, 0, 4, 4, 0]

我想使代码稍微通用一些,以便我也可以以其他方式执行此“扩展”。例如:

input_array = numpy.array([1, 2, 3, 4])

这次,通过在每个点上添加+ = 0.2来扩展每个点。因此,最终的数组将是:

[.8, .8, 1.2, 1.2, 1.8, 1.8, 2.2, 2.2, 2.8, 2.8, 3.2, 3.2, 3.8, 3.8, 4.2, 4.2]

我当前正在使用的代码如下所示。这是一种非常幼稚的方法,但是似乎有一种方法可以加快大型阵列的运行速度:

output = []
for x in input_array:
    output.append(expandPoint(x))

output = numpy.concatenate(output)

def expandPoint(x):
    return numpy.array([0, x, x, 0])

def expandPointAlternativeStyle(x):
    return numpy.array([x - .2, x - .2, x + .2, x + .2])

问题答案:

似乎您想在input_array包含扩展元素的数组和数组之间进行元素操作。对于这些,您可以使用broadcasting

对于第一个示例,似乎您正在执行elementwise multiplication-

In [424]: input_array = np.array([1, 2, 3, 4])
     ...: extend_array = np.array([0, 1, 1, 0])
     ...:

In [425]: (input_array[:,None] * extend_array).ravel()
Out[425]: array([0, 1, 1, 0, 0, 2, 2, 0, 0, 3, 3, 0, 0, 4, 4, 0])

对于第二个示例,看来您正在执行elementwise addition-

In [422]: input_array = np.array([1, 2, 3, 4])
     ...: extend_array = np.array([-0.2, -0.2, 0.2, 0.2])
     ...:

In [423]: (input_array[:,None] + extend_array).ravel()
Out[423]: 
array([ 0.8,  0.8,  1.2,  1.2,  1.8,  1.8,  2.2,  2.2,  2.8,  2.8,  3.2,
        3.2,  3.8,  3.8,  4.2,  4.2])