簡體   English   中英

數組和向量的numpy元素乘法

[英]numpy element-wise multiplication of an array and a vector

我想做這樣的事情:

a =  # multi-dimensional numpy array
ares = # multi-dim array, same shape as a
a.shape
>>> (45, 72, 37, 24)  # the relevant point is that all dimension are different
v = # 1D numpy array, i.e. a vector
v.shape
>>> (37)  # note that v has the same length as the 3rd dimension of a
for i in range(37):
    ares[:,:,i,:] = a[:,:,i,:]*v[i]

我認為必須有一個更緊湊的方式來做這個numpy,但我還沒弄明白。 我想我可以復制v然后計算a*v ,但我猜我還有更好的東西。 所以我需要“在一個給定的軸上”進行元素智能乘法,可以這么說。 誰知道我怎么做到這一點? 謝謝。 (順便說一下,我確實發現了一個非常復雜的問題,但由於OP在那里的特殊問題的性質,討論非常短暫,並被追蹤到其他問題。)

你可以使用numpy的einsum函數用愛因斯坦求和符號來做到這一點:

ares = np.einsum('ijkl,k->ijkl', a, v)

您可以自動將數據廣播到數組的最外軸。 因此,您可以轉置數組以將想要的軸交換到外部,相乘,然后將其轉置回:

ares = (a.transpose(0,1,3,2) * v).transpose(0,1,3,2)

我傾向於做類似的事情

b = a * v[None, None, :, None]

在哪里我認為我正式應該寫np.newaxis而不是None

例如:

>>> import numpy as np
>>> a0 = np.random.random((45,72,37,24))
>>> a = a0.copy()
>>> v = np.random.random(37)
>>> for i in range(len(v)):
...     a[:,:,i,:] *= v[i]
...     
>>> b = a0 * v[None,None,:,None]
>>> 
>>> np.allclose(a,b)
True

還有一個:

b = a * v.reshape(-1, 1)

恕我直言,這比transposeeinsum甚至v[:, None]更具可讀性,但選擇適合你風格的那個。

暫無
暫無

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

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