簡體   English   中英

Numpy:將每一行除以一個向量元素

[英]Numpy: Divide each row by a vector element

假設我有一個 numpy 數組:

data = np.array([[1,1,1],[2,2,2],[3,3,3]])

我有一個相應的“向量:”

vector = np.array([1,2,3])

我如何對每一行的data進行減法或除法運算,結果是:

sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]

長話短說:如何使用對應於每一行的一維標量數組對二維數組的每一行執行操作?

干得好。 您只需要將None (或np.newaxis )與廣播結合使用:

In [6]: data - vector[:,None]
Out[6]:
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

In [7]: data / vector[:,None]
Out[7]:
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])

如前所述,使用Nonenp.newaxes切片是一個很好的方法。 另一種選擇是使用轉置和廣播,如

(data.T - vector).T

(data.T / vector).T

對於更高維的數組,您可能需要使用 NumPy 數組的swapaxes方法或 NumPy rollaxis函數。 確實有很多方法可以做到這一點。

有關廣播的更完整說明,請參閱http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

Pythonic 的方法是......

np.divide(data.T,vector).T

這負責重塑,結果也是浮點格式。 在其他答案中,結果采用四舍五入的整數格式。

#NOTE:數據和向量中的列數不應匹配

JoshAdel 的解決方案使用 np.newaxis 添加維度。 另一種方法是使用reshape() 來對齊尺寸以准備廣播

data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])

data
# array([[1, 1, 1],
#        [2, 2, 2],
#        [3, 3, 3]])
vector
# array([1, 2, 3])

data.shape
# (3, 3)
vector.shape
# (3,)

data / vector.reshape((3,1))
# array([[1, 1, 1],
#        [1, 1, 1],
#        [1, 1, 1]])

執行 reshape() 允許維度排列以進行廣播:

data:            3 x 3
vector:              3
vector reshaped: 3 x 1

請注意, data/vector是可以的,但它不會為您提供您想要的答案。 它將array每一(而不是每一)除以vector每個對應元素。 如果您明確地將vector重塑為1x3而不是3x1這就是您會得到的。

data / vector
# array([[1, 0, 0],
#        [2, 1, 0],
#        [3, 1, 1]])
data / vector.reshape((1,3))
# array([[1, 0, 0],
#        [2, 1, 0],
#        [3, 1, 1]])

添加到stackoverflowuser2010的答案中,在一般情況下您可以使用

data = np.array([[1,1,1],[2,2,2],[3,3,3]])

vector = np.array([1,2,3])

data / vector.reshape(-1,1)

這會將您的向量變成column matrix/vector 允許您根據需要進行元素操作。 至少對我來說,這是最直觀的方法,因為(在大多數情況下)numpy 只會使用相同內部存儲器的視圖來重塑它也很有效。

關鍵是將大小為 (3,) 的向量重塑為 (3,1):將每行除以一個元素或 (1,3):將每列除以一個元素。 由於 data.shape 與 vector.shape 不對應,NumPy 會自動將 vector 的形狀擴展為 (3,3) 並按元素執行除法。

In[1]: data/vector.reshape(-1,1)
Out[1]:
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

In[2]: data/vector.reshape(1,-1)
Out[2]:
array([[1.        , 0.5       , 0.33333333],
       [2.        , 1.        , 0.66666667],
       [3.        , 1.5       , 1.        ]])

相似的:

x = np.arange(9).reshape(3,3)
x
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

x/np.sum(x, axis=0, keepdims=True)
array([[0.        , 0.08333333, 0.13333333],
       [0.33333333, 0.33333333, 0.33333333],
       [0.66666667, 0.58333333, 0.53333333]])

x/np.sum(x, axis=1, keepdims=True)
array([[0.        , 0.33333333, 0.66666667],
       [0.25      , 0.33333333, 0.41666667],
       [0.28571429, 0.33333333, 0.38095238]])

print(np.sum(x, axis=0).shape)
print(np.sum(x, axis=1).shape)
print(np.sum(x, axis=0, keepdims=True).shape)
print(np.sum(x, axis=1, keepdims=True).shape)
(3,)
(3,)
(1, 3)
(3, 1)

暫無
暫無

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

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