繁体   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