按元素添加numpy数组列表



我一直在研究神经网络中的反向传播算法。我的程序计算每个权重相对于损失函数的偏导数,并将其存储在一个数组中。每层的权重存储在单个2d numpy数组中,因此偏导数存储为numpy数组的数组,其中每个numpy数组具有不同的大小,这取决于每层中神经元的数量。

当我想在使用了大量训练数据后对偏导数数组求平均值时,我想把每个数组相加,然后除以数组的数量。目前,我只是遍历每个数组并将每个元素添加到一起,但有更快的方法吗?我可以使用dtype=object的ndarray,但显然,这已经被弃用了。

例如,如果我有数组:

arr1 = [ndarray([[1,1],[1,1],[1,1]]), ndarray([[2,2],[2,2]])]
arr2 = [ndarray([[3,3],[3,3],[3,3]]), ndarray([[4,4],[4,4]])]

我如何将这些添加在一起以获得阵列:

arr3 = [ndarray([[4,4],[4,4],[4,4]]), ndarray([[6,6],[6,6]])]

您不需要在数组元素中添加数字,通过使用numpy.add 来利用numpy的并行计算

这里有一些代码可以做到这一点:

import numpy as np
arr1 = np.asarray([[[1,1],[1,1],[1,1]], [[2,2],[2,2]]])
arr2 = np.asarray([[[3,3],[3,3],[3,3]], [[4,4],[6,6]]])
ans = []
for first, second in zip(arr1, arr2):
ans.append(np.add(first,second))

输出:

>>> [array([[4, 4], [4, 4], [4, 4]]), array([[6, 6], [8, 8]])]

第S页可以使用单行列表理解以及

ans = [np.add(first, second) for first, second in zip(arr1, arr2)]

您可以使用zip/map/sum:

import numpy as np
arr1 = [np.array([[1,1],[1,1],[1,1]]), np.array([[2,2],[2,2]])]
arr2 = [np.array([[3,3],[3,3],[3,3]]), np.array([[4,4],[4,4]])]
arr3 = list(map(sum, zip(arr1, arr2)))

输出:

>>> arr3
[array([[4, 4],
[4, 4],
[4, 4]]),
array([[6, 6],
[6, 6]])]

在NumPy中,可以通过添加两个NumPy数组来逐元素添加两个数组。N.B:如果你的数组形状不同,那么重新塑造数组并填充0。

arr1 = np.array([np.array([[1,1],[1,1],[1,1]]), np.array([[2,2],[2,2]])])
arr2 = np.array([np.array([[3,3],[3,3],[3,3]]), np.array([[4,4],[4,4]])])
arr3 = arr2 + arr1

您可以使用列表理解:

[x + y for x, y in zip(arr1, arr2)]

最新更新