numpy中reshape,multiply函数
multiply(a,b)就是個乘法。
一. 如果a,b是兩個數組,那么對應元素相乘.
1. 先來介紹下reshape()
>>> from numpy import * >>> a = array([[1,2,3], [4,5,6]]) >>> reshape(a, (3,-1)) array([[1, 2],[3, 4],[5, 6]]) >>>其中的參數-1表示懶得計算該填什么數字,由python通過a和另一個參數3推測出來。
例:下面是兩張2*3大小的照片(不知道有幾張照片用-1代替),如何把所有二維照片給攤平成一維
>>> image = array([[[1,2,3], [4,5,6]], [[1,1,1], [1,1,1]]]) >>> image.shape (2L, 2L, 3L) >>> image.reshape((-1, 6)) array([[1, 2, 3, 4, 5, 6],[1, 1, 1, 1, 1, 1]]) >>>從上面可以看出(2L, 2L, 3L)代表的是2張圖片,每張圖片是2行3列的數組;而reshape((-1, 6)處理之后,得到的是6列的數組,至于多少行由python匹配原數組后判斷。
又一例:tensorflow在做卷積神經網絡入門的手寫數字識別時 
 源碼:x_image = tf.reshape(x, [-1, 28, 28, 1]) 
 這里是將一組圖像矩陣x重建為新的矩陣,該新矩陣的維數為(a,28,28,1),其中-1表示a由實際情況來定。例如,x是一組圖像的矩陣(假設是50張,大小為56×56),則執行x_image = tf.reshape(x, [-1, 28, 28, 1])可以計算a=50×56×56/(28*28*1)=200。即x_image的維數為(200,28,28,1)。其中x_image的維數為(200,28,28,1)意思是:表示200張28x28的圖像。因為tensorflow做圖像處理時的input一般是一組圖像,那么(200,28,28,3)就表示200張28x28的3通道彩色圖像。
參考: https://www.zhihu.com/question/52684594
2. multiply是ufunc函數 
 當我們使用ufunc函數對兩個數組進行計算時,ufunc函數會對這兩個數組的對應元素進行計算,因此它要求這兩個數組有相同的大小(shape相同)。如果兩個數組的shape不同的話,會進行如下的廣播(broadcasting)處理:
實例:
這是兩個數組加的情況:先創建一個二維數組a,其shape為(6,1):
# -*- coding: utf-8 -*- import numpy as np a = np.arange(0, 60, 10).reshape(-1, 1) print "a:",a b = np.arange(0, 5) print 'b:',b c = a + b print "c:",c ,c.shape >>>運行結果:
>>> runfile('C:/Users/LiLong/Desktop/test.py', wdir='C:/Users/LiLong/Desktop') a: [[ 0][10][20][30][40][50]] b: [0 1 2 3 4] (5L,) c: [[ 0 1 2 3 4][10 11 12 13 14][20 21 22 23 24][30 31 32 33 34][40 41 42 43 44][50 51 52 53 54]] (6L, 5L) >>>計算a和b的和,得到一個加法表,它相當于計算a,b中所有元素組的和,得到一個shape為(6,5)的數組。
注:
- 由于a和b的shape長度不同,此時需要讓b的shape向a對齊,于是將b的shape前面加1,補齊為(1,5)。相當于做了如下計算:
這一步可以看出處理前后的區別。 
 (其中:arange和range的一個區別就是使用arange前先引入numpy,range不需要,使用一個參數看看range和arange有什么表現。range返回從0到4的5個數構成的列表(list),而arange返回一個數組(array)對象。不過他們的元素都是一樣的)
- 這樣加法運算的兩個輸入數組的shape分別為(6,1)和(1,5),根據規則2,輸出數組的各個軸的長度為輸入數組各個軸上的長度的最大值,可知輸出數組的shape為(6,5)。由于b的第0軸上的長度為1,而a的第0軸上的長度為6,因此為了讓它們在第0軸上能夠相加,需要將b在第0軸上的長度擴展為6,這相當于:
由于a的第1軸的長度為1,而b的第一軸長度為5,因此為了讓它們在第1軸上能夠相加,需要將a在第1軸上的長度擴展為5,這相當于:
>>> a = a.repeat(5, axis=1) >>> a array([[ 0, 0, 0, 0, 0],[10, 10, 10, 10, 10],[20, 20, 20, 20, 20],[30, 30, 30, 30, 30],[40, 40, 40, 40, 40],[50, 50, 50, 50, 50]]) >>>經過上述處理之后,a和b就可以按對應元素進行相加運算了。
同理得到兩個數組相乘的情況:
>>> x1=arange(9).reshape((3, 3)) >>> x2 = arange(3) >>> x1 array([[0, 1, 2],[3, 4, 5],[6, 7, 8]]) >>> x2 array([0, 1, 2]) >>> multiply(x1, x2) array([[ 0, 1, 4],[ 0, 4, 10],[ 0, 7, 16]]) >>>分析過程和相加的相同,只不過換成對應元素相乘。
參考: http://blog.csdn.net/qq_18433441/article/details/54868889
二. 如果a,b是兩個矩陣
矩陣點乘:矩陣對應元素相乘
>>> a1=mat([1,1]); >>> a2=mat([2,2]) >>> multiply(a1,a2) matrix([[2, 2]]) >>>得到的是和矩陣相乘相同的形式
矩陣相乘:
>>> a1=mat([1,2]); >>> a2=mat([[1],[2]]) >>> a1 matrix([[1, 2]]) >>> a2 matrix([[1],[2]]) >>> shape(a1) (1L, 2L) >>> shape(a2) (2L, 1L) >>> a1*a2 matrix([[5]]) >>>1*2的矩陣乘以2*1的矩陣,得到1*1的矩陣
以后遇到別的再學習。。
總結
以上是生活随笔為你收集整理的numpy中reshape,multiply函数的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 信用卡按最低还款额还款算逾期吗
- 下一篇: numpy矩阵运算和常用函数
