Nat*_*mas 8 python arrays numpy
我有一些数组,我希望使用加法广播到一个数组,我知道可以简单地这样做:
a = numpy.array([1,2,3])
b = numpy.array9[4,5,6])
sum = a + b
print(sum)
[5,7,9]
Run Code Online (Sandbox Code Playgroud)
但是,我不能像在这个简单的例子中那样对它进行硬编码,因为我将使用不同数量的输入多次运行我的脚本,因此每次都会有不同数量的数组.有时,我可能有a和b,但有时我可能有a,c和d但不是b等.
因此,使用循环我将我所拥有的数组附加到列表中,这样我最终得到的结果如下:
newlist = [array([1,2,3,...5,4,3]),
array([5,7,2,...4,6,7]),
array([3,6,2,...4,5,9])]
Run Code Online (Sandbox Code Playgroud)
在'newlist'中从数组中获取单个数组的最pythonic方法是什么,这是在其中添加数组,这样(来自newlist):
sum = [8,15,7,...14,15,19]
Run Code Online (Sandbox Code Playgroud)
阵列都是相同的形状.
Ash*_*ary 11
坚持使用Numpy数组并使用其sum()
方法:
>>> arr = np.array([[1,2,3,5,4,3],
[5,7,2,4,6,7],
[3,6,2,4,5,9]])
>>> arr.sum(axis=0)
array([ 9, 15, 7, 13, 15, 19])
Run Code Online (Sandbox Code Playgroud)
当然你也可以用Python列表来做,但它会很慢:
>>> lst = [[1,2,3,5,4,3],
[5,7,2,4,6,7],
[3,6,2,4,5,9]]
>>> map(sum, zip(*lst))
[9, 15, 7, 13, 15, 19]
Run Code Online (Sandbox Code Playgroud)
无需从您现有的1D数组创建2D数组。当然,这不会比将它们加在一起更快,例如reduce
与一起使用np.add
:
In [14]: a = [np.random.rand(10) for _ in range(10)]
In [15]: %timeit np.array(a).sum(axis=0)
100000 loops, best of 3: 10.7 us per loop
In [16]: %timeit reduce(np.add, a)
100000 loops, best of 3: 5.24 us per loop
Run Code Online (Sandbox Code Playgroud)
对于较大的阵列,它的优势甚至更低:
In [17]: a = [np.random.rand(1000) for _ in range(1000)]
In [18]: %timeit np.array(a).sum(axis=0)
100 loops, best of 3: 6.26 ms per loop
In [19]: %timeit reduce(np.add, a)
100 loops, best of 3: 2.43 ms per loop
Run Code Online (Sandbox Code Playgroud)
而且当然:
In [20]: np.allclose(np.array(a).sum(axis=0), reduce(np.add, a))
Out[20]: True
Run Code Online (Sandbox Code Playgroud)