1. 程式人生 > >Numpy:array的建立和ndarray的基本操作

Numpy:array的建立和ndarray的基本操作

Numpy

匯入:import numpy as np

1.建立陣列
  • 一維陣列的建立
    arr1=np.array([1,2,3,4,5],float)

  • 二維陣列的建立
    arr2=np.array([[1,2,3],[3,4,5],[1,5,8]])

注意:
如果傳進來的列表中包含不同的型別,則統一為統一型別,str>float>int

2.使用np的routines函式建立
  • np.ones([3,3])
    輸出結果:
    array([[ 1., 1., 1.],
    [ 1., 1., 1.],
    [ 1., 1., 1.]])

  • np.full([3,3],3.14)
    輸出結果:
    array([[ 3.14, 3.14, 3.14],
    [ 3.14, 3.14, 3.14],
    [ 3.14, 3.14, 3.14]])

  • np.eye(4)
    eye()返回一個對角線為1的矩陣
    輸出結果:
    array([[ 1., 0., 0., 0.],
    [ 0., 1., 0., 0.],
    [ 0., 0., 1., 0.],
    [ 0., 0., 0., 1.]])

  • 等差數列(此處num=5)
    np.linspace(0,10,5)
    輸出結果:
    array([ 0. , 2.5, 5. , 7.5, 10. ])

  • 等差數列(此處step=2)
    np.arange(0,10,2)
    輸出結果:
    array([0, 2, 4, 6, 8])

  • 隨機整數
    np.random.randint(0,10,5)
    輸出結果:
    array([0, 7, 2, 3, 7])

  • np.random.seed(100)#隨機的種子,有了種子,每次都一樣
    np.random.randn(10)
    輸出結果:
    array([ 0.37332715, -0.2887605 , 0.04985088, -0.93815832, -0.4087037 ,
    1.13352254, 0.52713526, -0.76014192, -0.97292788, 0.16290446])

  • random.random()預設0-1,左開右閉
    np.random.seed(3)#時間種子,將時間固定,產生固定不變的隨機數
    np.random.random(size=[2,2])
    輸出結果:
    array([[0.5507979 , 0.70814782],
    [0.29090474, 0.51082761]])

3.ndarray的屬性

4個必記引數:

  • ndim:維度
  • shape:形狀
  • size:總長度
  • dtype:元素型別

注意:dtype返回陣列元素的型別,type()函式返回陣列型別

4.索引

一維與列表完全一致 多維時同理

arr=np.random.randint(10,50,size=(3,4))
arr
a
array([[19, 46, 25, 10],
   [38, 35, 39, 39],
   [18, 19, 10, 46]])
  arr[1][2]
  39
5.切片

用以上例子中的a:
a[0:2] 獲取前兩行
a[0:2,0:2] 獲取前兩行前兩列
a[:,0:2] 獲取前兩列
a[::-1] 行倒序
a[:,::-1] 列倒序
a[::-1,::-1] 行、列全部倒序

6.變形
arr=np.random.randint(1,100,size=(100,))
  • 將一個一維陣列arr變成多維陣列

    arr.reshape((10,10)) #兩個引數分別是新陣列的行和列
    
  • 將多維陣列變成一維陣列

    a.reshape(12) #12是陣列長度
    
  • arr.reshape(-1,10)
    -1:手動指定列數,自動計算行數

7.級聯

np.concatenate() 級聯需要注意的點:

  • 級聯的引數是列表:一定要加中括號
  • 維度必須相同
  • 形狀相符
  • axis引數:0表示縱向級聯,1表示橫向級聯;axis的範圍由陣列維度決定0-(維度-1)

np.hstack與np.vstack 水平級聯與垂直級聯

8.切分
  • np.spilt()
x = np.arange(1,10)
x

輸出:
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

x1,x2,x3 = np.split(x,[3,5])
print(x1,x2,x3)
輸出:
[1 2 3] [4 5] [6 7 8 9]
  • np.hsplit() 切分行

    x = np.arange(16).reshape(4,4)
    x
    輸出:
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])
    
    print(np.hsplit(x,[2,3]))
    輸出:
    [array([[ 0,  1],[ 4,  5], [ 8,  9], [12, 13]]),
             array([[ 2],  [ 6],  [10], [14]]), 
             array([[ 3],  [ 7],  [11],  [15]])]
    
  • np.vsplit () 切分列

    x = np.arange(16).reshape(4,4)
    x
    輸出:
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])
    print(np.vsplit(x,[2,3]))
    輸出:
    [array([[0, 1, 2, 3],
            [4, 5, 6, 7]]), array([[ 8,  9, 10, 11]]), array([[12, 13, 14, 15]])]
    
9.副本
  • 所有賦值運算不會為ndarray的任何元素建立副本。對賦值後的物件的操作也對原來的物件生效

    a = np.array([1,2,3])
    b=a
    print(a,b)
    
    輸出:
    [1 2 3] [1 2 3]
    
    b[0]=2
    a
    輸出:
    array([2, 2, 3])
    
  • copy()函式可建立副本,對副本的操作,不會影響原來的物件

    a = np.array([1,2,3])
    b = a.copy()
    b
    輸出:
    [1,2,3]
    
    b[0]=3
    print(a,b)
    輸出:
    [1 2 3] [3 2 3]
    
10.使用matplotlib.pyplot獲取一個數組,資料來源於一張圖片
import matplotlib.pyplot as plt
img=plt.imread('C:/Users/jiaxinyi/Desktop/a4coho1467042412050.jpg')
img.shape #得到的陣列形狀
輸出:
(650,1200,3)

圖一

這裡寫圖片描述