说明:本blog基于python3版本, numpy 1.22.0
numpy的数学统计方法主要有7个,分别是 sum(求和),mean(求均值),std/var(求标准差/方差),min/max(求最大/最小值),argmin/argmax(求最大/最小值的位置),cumsum(求累和),cumprod(求累积)
数学统计方法的全元素操作,对函数无需加入参数axis;
比如我想求数组a的全元素最大值位置,代码如下
import numpy as np
a = np.array([[1,-2,-3],[4,-5,6]])
arg = np.argmax(a)
print(a)
print(arg)
结果如下,
[[ 1 -2 -3]
[ 4 -5 6]]
5
由上可知,我们得到全元素最大位置是5;为什么是5而不是(1,2)呢?因为我们在使用numpy的数学统计方法时,**如果明确参数axis的值,就会默认对全元素操作,把整个ndarray视为一维数组,由里向外对所有元素按着一维数组的方式排列顺序;**回到本题,就是第5个位置最大。
当然,我们可以写出一个三维数组,进一步熟悉argmax方法的原理
import numpy as np
a = np.array([[[1,-2,-3],[4,-5,6]],[[7,8,-9],[10,11,-12]]])
arg = np.argmax(a)
print(a)
print(arg)
结果如下,
[[[ 1 -2 -3]
[ 4 -5 6]]
[[ 7 8 -9]
[ 10 11 -12]]]
10
nice! 第11个位置元素最大(因为python的位置是从0开始);argmax方法在神经网络中经常用到,请多加留意。
数学统计方法的按轴操作,对函数需加入参数axis;axis对应轴按从外往里扒衣原则,该原则与ndarray的shape属性所遵照的原则相同
如果对numpy.shape属性感兴趣,请参考博文中的numpy基本属性部分
比如我想求数组a的最内层的最大值位置,代码如下
代码如下
import numpy as np
a = np.array([[[1,-2,-3],[4,-5,6]],[[7,8,-9],[10,11,-12]]])
arg = np.argmax(a, axis = 2)
print(a)
print(arg)
结果如下,
[[[ 1 -2 -3]
[ 4 -5 6]]
[[ 7 8 -9]
[ 10 11 -12]]]
[[0 2]
[1 1]]
由上边结果,我们可以看到结果符合我们预期,具体解释如下:
[ 1 -2 -3]最大值为1,位置0
[ 4 -5 6]最大值为6,位置2
[ 7 8 -9]最大值为8,位置1
[ 10 11 -12]最大值为11,位置1
所以最终返回一个二维ndarray
[[0 2]
[1 1]]
另外,我们还可求a中间层的最大值位置
代码如下
import numpy as np
a = np.array([[[1,-2,-3],[4,-5,6]],[[7,8,-9],[10,11,-12]]])
arg = np.argmax(a, axis = 1)
print(a)
print(arg)
结果如下
[[[ 1 -2 -3]
[ 4 -5 6]]
[[ 7 8 -9]
[ 10 11 -12]]]
[[1 0 1]
[1 1 0]]
具体解释如下:
[ 1 4]最大值为4,位置1
[ -2 -5]最大值为-2,位置0
[ -3 6]最大值为6,位置1
[ 7 10]最大值为10,位置1
[8 11]最大值为11,位置1
[ -9 -12]最大值为-9,位置0
所以最终返回一个二维ndarray
[[1 0 1]
[1 1 0]]
当然,我们还可以求最外层的最大值位置
代码如下
import numpy as np
a = np.array([[[1,-2,-3],[4,-5,6]],[[7,8,-9],[10,11,-12]]])
arg = np.argmax(a, axis = 0)
print(a)
print(arg)
结果如下
[[[ 1 -2 -3]
[ 4 -5 6]]
[[ 7 8 -9]
[ 10 11 -12]]]
[[1 1 0]
[1 1 0]]
具体解释如下:
[ 1 7]最大值为7,位置1
[ -2 8]最大值为8,位置1
[ -3 -9]最大值为-3,位置0
[ 4 7]最大值为7,位置1
[-5 11]最大值为11,位置1
[ 6 -12]最大值为6,位置0
所以最终返回一个二维ndarray
[[1 1 0]
[1 1 0]]
其实就是遵循一个原则,每层扒衣,元素比较
写在最后,如果本blog对你帮助,欢迎点赞讨论,共同进步~