【问题标题】:numpy divide along axisnumpy沿轴划分
【发布时间】:2011-08-21 19:58:32
【问题描述】:

是否有一个 numpy 函数可以沿轴将数组与另一个数组中的元素分开?例如,假设我有一个形状为 (l,m,n) 的数组 a 和一个形状为 (m,) 的数组 b;我正在寻找相当于:

def divide_along_axis(a,b,axis=None):
    if axis is None:
        return a/b
    c = a.copy()
    for i, x in enumerate(c.swapaxes(0,axis)):
        x /= b[i]
    return c

例如,这在规范化向量数组时很有用:

>>> a = np.random.randn(4,3)
array([[ 1.03116167, -0.60862215, -0.29191449],
       [-1.27040355,  1.9943905 ,  1.13515384],
       [-0.47916874,  0.05495749, -0.58450632],
       [ 2.08792161, -1.35591814, -0.9900364 ]])
>>> np.apply_along_axis(np.linalg.norm,1,a)
array([ 1.23244853,  2.62299312,  0.75780647,  2.67919815])
>>> c = divide_along_axis(a,np.apply_along_axis(np.linalg.norm,1,a),0)
>>> np.apply_along_axis(np.linalg.norm,1,c)
array([ 1.,  1.,  1.,  1.])

【问题讨论】:

    标签: numpy vector divide


    【解决方案1】:

    对于您给出的具体示例:将 (l,m,n) 数组除以 (m,) 您可以使用 np.newaxis:

    a = np.arange(1,61, dtype=float).reshape((3,4,5)) # Create a 3d array 
    a.shape                                           # (3,4,5)
    
    b = np.array([1.0, 2.0, 3.0, 4.0])                # Create a 1-d array
    b.shape                                           # (4,)
    
    a / b                                             # Gives a ValueError
    
    a / b[:, np.newaxis]                              # The result you want 
    

    您可以阅读有关广播规则here 的所有信息。如果需要,您还可以多次使用 newaxis。 (例如,将形状 (3,4,5,6) 数组除以形状 (3,5) 数组)。

    根据我对文档的理解,使用 newaxis + 广播还可以避免任何不必要的数组复制。

    索引、newaxis 等现在在here 中得到更全面的描述。 (自此答案首次发布以来,文档已重新组织)。

    【讨论】:

      【解决方案2】:

      我认为你可以通过 numpy 的通常广播行为来获得这种行为:

      In [9]: a = np.array([[1., 2.], [3., 4.]])
      
      In [10]: a / np.sum(a, axis=0)
      Out[10]:
      array([[ 0.25      ,  0.33333333],
             [ 0.75      ,  0.66666667]])
      

      如果我的解释正确。

      如果你想要另一个轴,你可以转置一切:

      > a = np.random.randn(4,3).transpose()
      > norms = np.apply_along_axis(np.linalg.norm,0,a)
      > c = a / norms
      > np.apply_along_axis(np.linalg.norm,0,c)
      array([ 1.,  1.,  1.,  1.])
      

      【讨论】:

      • 不,你没有。例如,我以二维数组为例,该方法失败了。事实证明,对于我给你的例子,你可以做 c = a/np.apply_along_axis(np.linalg.norm,1,a)[:,np.newaxis] 但我正在寻找更一般的东西,比如函数divide_along_axis() 我在问题中定义。
      • 转调怎么样(见编辑的答案)?或者你可以定义divide_along_axis,先转置、除法,然后转回。
      • 只需为您的一维数组添加一个新轴。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2011-01-22
      相关资源
      最近更新 更多