我有一个数组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代替循环吗?
答案 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])