【问题标题】:Numpy power ufunc operating on specific axisNumpy power ufunc 在特定轴上运行
【发布时间】:2019-04-18 15:04:16
【问题描述】:

我觉得奇怪的是 numpy.power 没有轴参数...是不是因为有更好/更安全的方法来实现相同的目标(将 3D 数组中的每个 2D 数组提升到 1D 数组的幂) .

假设您有一个 (3,10,10) 数组 (A),并且您希望将每个 (10,10) 数组提升到形状为 (3,) 的数组 B 中的元素的幂。 您应该可以使用np.power(A,B,axis=0) 来做到这一点,对吧? 然而它会产生以下 TypeError :

TypeError: 'axis' is an invalid keyword to ufunc 'power'

由于 power 似乎没有轴或轴参数(尽管是 ufunc),所以首选的方法是什么?

可能有一个使用ufunc.reduce 方法的解决方案,但我真的不明白它如何与numpy.power 一起工作...

现在我做:

np.array([A[i,:,:]**B[i] for i in range(3)])

但它看起来很难看,而且效率可能不如 numpy 方法。

谢谢

【问题讨论】:

标签: python numpy numpy-ufunc


【解决方案1】:

power 不是 reduction 操作:它不会将数字集合减少为单个数字,因此 axis 参数没有意义。诸如summax 之类的操作是归约,因此指定一个轴来应用归约是有意义的。

您想要的操作是broadcasting。这是一个较小的示例,A 的形状为 (3, 2, 2),B 的形状为 (3,)。我们不能写np.power(A, B),因为形状不兼容广播。我们首先必须向B 添加微不足道的维度,使其形状为 (3, 1, 1)。这可以通过例如B[:, np.newaxis, np.newaxis]B.reshape(-1, 1, 1) 来完成。

In [100]: A                                                                                                                                                    
Out[100]: 
array([[[1, 1],
        [3, 3]],

       [[3, 2],
        [1, 1]],

       [[3, 2],
        [1, 3]]])

In [101]: B                                                                                                                                                    
Out[101]: array([2, 1, 3])

In [102]: np.power(A, B[:, np.newaxis, np.newaxis])                                                                                                            
Out[102]: 
array([[[ 1,  1],
        [ 9,  9]],

       [[ 3,  2],
        [ 1,  1]],

       [[27,  8],
        [ 1, 27]]])

np.newaxis 的值是None,因此您经常会看到使用None 而不是np.newaxis 的表达式。您也可以使用** 运算符代替函数power

In [103]: A ** B[:, None, None]                                                                                                                                
Out[103]: 
array([[[ 1,  1],
        [ 9,  9]],

       [[ 3,  2],
        [ 1,  1]],

       [[27,  8],
        [ 1, 27]]])

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2021-06-04
    相关资源
    最近更新 更多