Numpy:用vector元素划分每一行

假设我有一个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]] 

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

干得好。 你只需要使用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切片是一个很好的方法。 另一种select是使用转置和广播,如在

 (data.T - vector).T 

 (data.T / vector).T 

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

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

JoshAdel的解决scheme使用np.newaxis来添加一个维度。 另一种方法是使用reshape()alignment尺寸以准备广播 。

 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每个对应元素。 这是你会得到的,如果你明确地改造vector1x3而不是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]])