python - 在特定轴上运行的 Numpy power ufunc

标签 python numpy numpy-ufunc

我觉得 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 方法有效。

谢谢

最佳答案

power不是缩减操作:它不会将数字集合缩减为单个数字,因此 axis争论没有意义。 sum等操作或 max是缩减,因此指定应用缩减的轴是有意义的。

你想要的操作是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]]])

关于python - 在特定轴上运行的 Numpy power ufunc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55748842/

相关文章:

python - 使用 2 个坐标选择数组中的项目并填充它

python - 贝塞尔函数(来自 scipy.special)可以与 Numba 一起使用吗

python - 使用 __numpy_ufunc__()

python-3.x - Numpy 具有复数和 +=

python - 如何对 Flask-admin 字段执行验证

python - 如何将 Tavern 测试的响应保存在 JSON 文件中?

python - 如何将 dronekit 与来自 d​​ev Wiki 的 SITL vagrant VM 一起使用

python - 填充 Numpy 数组的有效方法

python - 寻找最大正值或最小负值的向量化版本

python - 用于对 2d 点进行二元分类的深度神经网络模型的训练和测试准确率达到 50%