本文主要是介绍【Python学习笔记】23:numpy的add和multiply,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
add和multiply是numpy里比较常用的两种运算,分别是加法和乘法运算。
加法运算
>>> np.add.accumulate([1,2,3]) #累加
array([1, 3, 6], dtype=int32)
累加np.add.accumulate()适用于python序列(串不行)和numpy数组,每一个位置的元素和前面的所有元素加起来求和,得到的始终是numpy数组。
>>> np.add.reduce([1,2,3,4,5]) #连加
15
连加np.add.reduce()是将所有元素加在一起求和。
>>> x=np.array([1,2,3,4])
>>> np.add.at(x,[0,2],3)
>>> x
array([4, 2, 6, 4])
np.add.at()是将传入的数组中制定下标位置的元素加上指定的值,如上面是将x中下标为0和为2的元素加上了3,这会改变传入的数组x。
>>> np.add.outer([1,2,3],[4,5,6,7])
array([[ 5, 6, 7, 8],[ 6, 7, 8, 9],[ 7, 8, 9, 10]])
np.add.outer()将第一个列表或数组中的每个元素依次加到第二个列表或数组中的每个元素,得到每一行。
>>> x=np.arange(8)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> np.add.reduceat(x,[0,4,1,5,2,6,3,7]) #在各切片上作reduce运算
array([ 6, 4, 10, 5, 14, 6, 18, 7], dtype=int32)
np.add.reduceat()对于传入的数组,根据传入的list(第二个参数)作指定的变化,传入的list中的数字是成对出现的。如上面的例子中是将x中0,4部分切片作np.add.reduce()运算(也就是连加),放在第一个位置,然后第二个位置就是下标4在x中的值,也就是4,以此类推。
>>> x=np.linspace(0,15,16).reshape(4,4)
>>> x
array([[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.],[ 12., 13., 14., 15.]])
>>> np.add.reduceat(x,[0,3,1])
array([[ 12., 15., 18., 21.],[ 12., 13., 14., 15.],[ 24., 27., 30., 33.]])
这个例子是对于二维数组的reduceat的用法,0->3是一个切片,1->默认下界是一个切片,所以所得第0行为原来的第0行+第1行+第2行,所得第1行为原来的第3行,所得第2行为原来的第1行+至默认结尾,也就是第1行+第2行+第3行。
总的来说,redeceat函数传入的indices参数列表中的每个元素要看它后面的元素是不是比它大,如果比它大,作两者间的切片reduce,反之,它自己对应的元素即是该处结果。对于最后一个参数,因为其后已经没有元素,我们规定最后一项为从该参数到默认结尾作reduce连加。可以看下面这个例子。
>>> np.add.reduceat(x,[0,3,1,1])
array([[ 12., 15., 18., 21.],[ 12., 13., 14., 15.],[ 4., 5., 6., 7.],[ 24., 27., 30., 33.]])
四行分别是原来的0->3切片,3行,1行,1->默认切片。
>>> np.add.reduceat(x,[0,3,1,3],axis=1) #对列进行计算
array([[ 3., 3., 3., 3.],[ 15., 7., 11., 7.],[ 27., 11., 19., 11.],[ 39., 15., 27., 15.]])
可以看到它还有一个默认参数axis=0表示对行进行计算,上面的例子中axis为1表示对列进行计算,从左到右的四列分别是原来的0->3列切片,3列,1->3列切片,3列。
乘法运算
>>> x=np.arange(8)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> np.multiply.at(x,[0,1,2],5)
>>> x
array([ 0, 5, 10, 3, 4, 5, 6, 7])
乘法与加法的几个函数用法很相似,np.multiply.at()表示将某个数组中的制定下标元素乘以指定值,如上面是对x中下标为0,1,2的元素都乘以了5。这会改变原数组。
>>> np.multiply.accumulate([1,2,3,4])
array([ 1, 2, 6, 24], dtype=int32)
np.multiply.accumulate()表示累乘,每个元素和它前面的所有元素相乘,返回新的数组。
>>> np.multiply.outer([1,2,3],[4,5,6])
array([[ 4, 5, 6],[ 8, 10, 12],[12, 15, 18]])
np.multiply.outer()表示将第一个列表或数组中的每个元素依次乘到第二个列表或数组中的每个元素,得到每一行。
>>> np.multiply.reduce([1,2,3,4])
24
np.multiply.reduce表示连乘,所有元素相乘。对于二维的数组,还有下面的用法。
>>> np.multiply.reduce([[1,2,3,4],[5,6,7,8]])
array([ 5, 12, 21, 32])
这表示纵向的(外部)reduce,每个子数组的对应子元素相乘,得到新的数组。
>>> np.multiply.reduce([[1,2,3,4],[5,6,7,8]],axis=1)
array([ 24, 1680])
这表示横向的(内部)reduce,每个子数组自己作reduce即可。
>>> x=np.linspace(0,15,16).reshape(4,4)
>>> x
array([[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.],[ 12., 13., 14., 15.]])
>>> np.multiply.reduceat(x,[0,3,1])
array([[ 0., 45., 120., 231.],[ 12., 13., 14., 15.],[ 384., 585., 840., 1155.]])
和add的reduceat用法一样,这三行分别是原来行的0->3切片,3行,1->默认结尾切片。
>>> np.multiply.reduceat(x,[0,3,1],axis=1)
array([[ 0., 3., 6.],[ 120., 7., 210.],[ 720., 11., 990.],[ 2184., 15., 2730.]])
这三列分别是原来列的0->3切片,3列,1->默认结尾切片。multiply的reduceat函数作的都是外部的reduce。
这篇关于【Python学习笔记】23:numpy的add和multiply的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!