将函数应用于数组,然后将结果附加到数组中,而无需在python中循环

时间:2018-07-27 19:24:05

标签: python arrays numpy reduce

我有一个数组a和一个列表b。 我想将a中的值索引的b中的值求和,然后将其附加到a

例如,a[[1,2]] = 3 + 4 = 7然后将7附加到a

import numpy as np
a = np.array([1,3,4,5,6])
b = [[1,2], [3,4]]

for positions in b:
    tmp = a[positions].sum()
    a = np.append(a, tmp)

a 
array([ 1,  3,  4,  5,  6,  7, 11])

我可以使用reduce代替循环吗?

3 个答案:

答案 0 :(得分:1)

您可以使用numpy.hstack

c = np.hstack((a, a[np.r_[b]].sum(1)))

print(c)

array([ 1,  3,  4,  5,  6,  7, 11])

numpy.append(尤其是在循环中)效率低下,不建议使用。要查看此处发生的情况,请注意np.r_将数组作为输入并沿第一个轴堆叠结果:

print(a[np.r_[b]])

array([[3, 4],
       [5, 6]])

然后我们只需要沿轴1求和,并与原始数组堆叠即可。

答案 1 :(得分:0)

可以使用np.concatenate

>>> np.concatenate([a, [a[pos].sum() for pos in b]])
array([ 1,  3,  4,  5,  6,  7, 11])

答案 2 :(得分:0)

根据文档减少

  

两个自变量的

Appl [ies]函数从左到右累计到iterable的项上,以便将iterable减小为单个值。例如,reduce(lambda x,y:x + y,[1,2,3,4,5])计算(((((1 + 2)+3)+4)+5)。

reduce的主要组成部分是reduce依次对列表中的输入对进行操作,并将列表简化为单个数字。

您的示例代码仅按顺序显示positions,但是如果不是这样,则reduce将是一个不好的选择。另外,由于要将多个值添加到原始列表(7和11),因此必须多次使用reduce操作,因为每次操作只会产生一个输出。

您可以考虑使用列表理解:

import numpy as np
a = np.array([1,3,4,5,6])
b = [[1,2], [3,4]]
np.append(a, [a[positions].sum() for positions in b])

a 
array([ 1,  3,  4,  5,  6,  7, 11])