Numpy:用向量元素划分每一行

时间:2013-10-26 02:34:28

标签: python arrays numpy scipy

假设我有一个numpy数组:

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

我有一个相应的“vector:”

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

长话短说:如何使用与每行对应的一维标量数组对2D数组的每一行执行操作?

6 个答案:

答案 0 :(得分:145)

你走了。您只需将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]])

答案 1 :(得分:10)

如上所述,使用Nonenp.newaxes进行切片是一种很好的方法。 另一种选择是使用转置和广播,如

(data.T - vector).T

(data.T / vector).T

对于更高维数组,您可能希望使用NumPy数组的swapaxes方法或NumPy rollaxis函数。 确实有很多方法可以做到这一点。

有关广播的更全面的解释,请参阅 http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

答案 2 :(得分:1)

JoshAdel的解决方案使用np.newaxis添加维度。另一种方法是使用reshape() to align the dimensions in preparation for broadcasting

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

执行重塑()允许维度排列广播:

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

答案 3 :(得分:0)

Pythonic方法是...

np.divide(data,vector)

这将进行重塑,结果也是浮点格式。 在其他答案中,结果采用四舍五入的整数格式。

#注意:数据和向量中的列数均不应匹配

答案 4 :(得分:0)

添加到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只会使用相同内部内存的视图来重塑它的效率。

答案 5 :(得分:0)

关键是将大小为 (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)