numpy从2d数组中减去/添加1d数组

时间:2015-10-23 13:20:07

标签: python arrays numpy

我有以下2D数组:

a = array([[ 1,  2,  3],
           [ 4,  5,  6],
           [ 7,  8,  9],
           [10, 11, 12],
           [13, 14, 15]])

和另一个1D阵列:

b = array([ 1,  2,  3,  4,  5])

然后我想计算像

这样的东西
c = a - b

意图得到:

c = array([[0, 1,  2],
           [2, 3,  4],
           [4, 5,  6],
           [6, 7,  8],
           [8, 9, 10]])

但我收到错误消息:

Traceback (most recent call last):
  Python Shell, prompt 79, line 1
ValueError: operands could not be broadcast together with shapes (5,3) (5,)

我阅读了广播规则,但没有更明智。我可以使用for循环或类似方法进行解决,但应该有一个直接的方法。感谢

3 个答案:

答案 0 :(得分:18)

您需要转换数组.Where()数组,在索引元组中使用b to a (2, 1) shape。这是Indexing of Numpy array

你可以这样做:

None or numpy.newaxis

输出:

import numpy

a = numpy.array([[ 1,  2,  3],
           [ 4,  5,  6],
           [ 7,  8,  9],
           [10, 11, 12],
           [13, 14, 15]])

b = numpy.array([ 1,  2,  3,  4,  5])
c=a - b[:,None]
print c

答案 1 :(得分:3)

作为评论中指定的Divakar,只需向b添加新轴即可。

我建议你阅读更多关于broadcasting的内容,这对于在numpy中矢量化计算非常有用:有趣的是,a.transpose() - b不会引发错误(你需要再次转置结果以获得所需的输出。)

在此计算中,第一个数组的形状为(3, 5)b.shape为(5,)。因此b的形状对应于a形状的尾部,并且可以发生广播。当第一个数组的形状为(5, 3)时,情况并非如此,因此您获得了错误。

以下是一些运行时测试,用于比较建议答案的速度,以及ab的值:您可以看到差异不是很显着

In [9]: %timeit (a.T - b).T
Out[9]: 1000000 loops, best of 3: 1.32 µs per loop

In [10]: %timeit a - b[:,None]
Out[10]: 1000000 loops, best of 3: 1.25 µs per loop

In [11]: %timeit a - b[None].T
Out[11]: 1000000 loops, best of 3: 1.3 µs per loop

答案 2 :(得分:0)

有时可以这样做:

C = numpy.zeros(shape=A.shape)
for i in range(len(A)):
    C[i] = A[i] - B[i]

S = C.astype(int)
print(S)