首页 文章

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

提问于
浏览
89

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

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

4 回答

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

    执行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]])
    
  • 10

    干得好 . 您只需要将 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]])
    
  • 142

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

    (data.T - vector).T
    

    (data.T / vector).T
    

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

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

  • 0

    Pythonic的方法是......

    np.divide(data,vector)
    

    这需要重新整形,结果也是浮点格式 . 在其他答案中,结果采用舍入整数格式 .

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

相关问题