numpy沿轴线分开

时间:2011-08-21 19:58:32

标签: numpy vector divide

是否有一个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.])

2 个答案:

答案 0 :(得分:27)

对于您给出的具体示例:将(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 + broadcast也避免了任何不必要的数组复制。

现在更全面地描述了索引,newaxis等here。 (自该答案首次​​发布以来,文档已重组)。

答案 1 :(得分:0)

我认为你可以通过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.])