2015-10-23 105 views
5

我有以下的二维数组:numpy的减/从二维阵列添加一维数组

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

和另一维数组:

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-loops或类似的方法做一个解决方法,但应该有一个直接的方法。谢谢

+9

待办事项'A - B [:,无]'或'a - b [:,np.newaxis]',即通过添加一个维度将'b'转换为二维数组,然后进行减法。 – Divakar

+2

@Divakar你应该从你的评论中回答问题。 –

+1

这不是像'SO'这样的基本问题吗? DUP-锤? :) – Divakar

回答

13

你需要转换数组b to a (2, 1) shape数组,在索引元组中使用None or numpy.newaxis。这里是Indexing of Numpy array

你可以不喜欢它:

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 

输出:

Out[2]: 
array([[ 0, 1, 2], 
     [ 2, 3, 4], 
     [ 4, 5, 6], 
     [ 6, 7, 8], 
     [ 8, 9, 10]]) 
+0

完美。这有帮助。谢谢 – leofields

+0

@leofields:如果你喜欢我的回答,你应该接受这个 –

2

由于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 
+0

'a.transpose() - b'需要另一个转置来获得所需的输出,对吧? – Divakar

+0

@Divakar是的,是的,我没有提出解决方案,我明确告诉你要使用你的解决方案。由于您的解决方案是评论,我补充了广播无法正常工作的原因。如果你发布了答案,我会评论它。 –

+0

我是为了完成这篇文章的目的而说明如何获得想要的输出和形状:) – Divakar