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

BFT*_*FTM 102 python arrays numpy scipy

假设我有一个numpy数组:

data = np.array([[1,1,1],[2,2,2],[3,3,3]])
Run Code Online (Sandbox Code Playgroud)

我有一个相应的"矢量:"

vector = np.array([1,2,3])
Run Code Online (Sandbox Code Playgroud)

如何对data每行进行减法或除法运算,结果如下:

sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*del 158

干得好.您只需要使用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]])
Run Code Online (Sandbox Code Playgroud)

  • [here](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#numpy.newaxis)是doc. (13认同)
  • [可视化示例](https://www.w3resource.com/python-exercises/numpy/python-numpy-exercise-96.php) (2认同)

Ian*_*anH 10

如前所述,使用None或使用切片np.newaxes是一种很好的方法.另一种选择是使用转置和广播,如

(data.T - vector).T
Run Code Online (Sandbox Code Playgroud)

(data.T / vector).T
Run Code Online (Sandbox Code Playgroud)

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

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


meo*_*eow 10

添加到 stackoverflowuser2010 的答案,一般情况下你可以使用

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

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

data / vector.reshape(-1,1)
Run Code Online (Sandbox Code Playgroud)

这会将您的向量变成column matrix/vector. 允许您按照您的意愿进行元素运算。至少对我来说,这是最直观的方法,因为(在大多数情况下)numpy 将只使用相同内部内存的视图来进行重塑,它也很有效。

  • 这应该是公认的答案。使用“.reshape(-1,1)”创建列向量是使用广播的最直观方法。 (3认同)

sha*_*hak 5

Pythonic 的方法是......

np.divide(data.T,vector).T
Run Code Online (Sandbox Code Playgroud)

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

#NOTE:数据和向量中的列数不应匹配