簡體   English   中英

numpy 從二維數組中減去/添加一維數組

[英]numpy subtract/add 1d array from 2d array

我有以下二維數組:

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 或類似方法做一個解決方法,但應該有一個直接的方法。 謝謝

您需要將數組b to a (2, 1) shape轉換b to a (2, 1) shape數組,在索引元組中使用None or numpy.newaxis 這是Numpy數組索引

你可以這樣做:

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]])

正如評論中指定的Divakar,只需向b添加一個新軸。

我建議你閱讀更多有關廣播的內容 ,這對於在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

有時這樣做很有用:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM