日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

numpy中reshape,multiply函数

發布時間:2024/9/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)處理:

  • 讓所有輸入數組都向其中shape最長的數組看齊,shape中不足的部分都通過在前面加1補齊
  • 輸出數組的shape是輸入數組shape的各個軸上的最大值
  • 如果輸入數組的某個軸和輸出數組的對應軸的長度相同或者其長度為1時,這個數組能夠用來計算,否則出錯
  • 當輸入數組的某個軸的長度為1時,沿著此軸運算時都用此軸上的第一組值
  • 實例

    這是兩個數組加的情況:先創建一個二維數組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)。相當于做了如下計算:
    >>> b array([0, 1, 2, 3, 4]) >>> b.shape=1,5 >>> b array([[0, 1, 2, 3, 4]]) >>>

    這一步可以看出處理前后的區別。
    (其中:arange和range的一個區別就是使用arange前先引入numpy,range不需要,使用一個參數看看range和arange有什么表現。range返回從0到4的5個數構成的列表(list),而arange返回一個數組(array)對象。不過他們的元素都是一樣的)

    In [1]range(5) Out[1]: [0, 1, 2, 3, 4]In [2]:from numpy import *In [3]:arange(5) Out[3]: array([0, 1, 2, 3, 4])
    • 這樣加法運算的兩個輸入數組的shape分別為(6,1)和(1,5),根據規則2,輸出數組的各個軸的長度為輸入數組各個軸上的長度的最大值,可知輸出數組的shape為(6,5)。由于b的第0軸上的長度為1,而a的第0軸上的長度為6,因此為了讓它們在第0軸上能夠相加,需要將b在第0軸上的長度擴展為6,這相當于:
    >>> b.repeat(6,axis=0) array([[0, 1, 2, 3, 4],[0, 1, 2, 3, 4],[0, 1, 2, 3, 4],[0, 1, 2, 3, 4],[0, 1, 2, 3, 4],[0, 1, 2, 3, 4]]) >>>

    由于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函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。