ndim
:維度shape
:行數和列數size
:元素個數import numpy as np # 定義數組 array = np.array([[1,2,3],[2,3,4]]) print(array) # ndim 維度的數量 print('維度的數量',array.ndim) # 維度 print('維度',array.shape) # 數組元素的個數 print('數組元素的個數',array.size) # 對象元素的類型 print('對象元素的類型',array.dtype) # 對象每一個元素的大小、以字節爲單位 print('對象每一個元素的大小、以字節爲單位',array.itemsize) # 對象內存信息 print(' 對象內存信息',array.flags)
就是0軸匹配的是index, 涉及上下運算;1軸匹配的是columns, 涉及左右運算。

amin(a,0) 是延着 axis=0 軸的最小值,axis=0是把元素當作[1,2,3],[4,5,6],[7,8,9]三個元素,因此最小值是[1,2,3],html
amin(a,1) 是延着 axis=1 軸的最小值,axis=1 軸是把元素當作了 [1,4,7],[2,5,8], [3,6,9] 三個元素,因此最小值爲 [1,4,7]。
數組
a = np.array([[1,2,3], [4,5,6],[7,8,9]]) print('a=',a,'\n') print('a[1]:',a[1]) print(np.amin(a)) print(np.amin(a,0)) print(np.amin(a,1)) print(np.amax(a)) print(np.amax(a,0)) print(np.amax(a,1)) a= [[1 2 3] [4 5 6] [7 8 9]] a[1]: [4 5 6] 1 [1 2 3] [1 4 7] 9 [7 8 9] [3 6 9]
關鍵字
array:建立數組
dtype:指定數據類型
zeros:建立數據全爲0
ones:建立數據全爲1
empty:建立數據接近0
arange:按指定範圍建立數據
linspace:建立線段
具體代碼:機器學習
# 建立數組 import numpy as np a = np.array([1,2,3]) print(a) [1 2 3] # 指定數組類型 指定數據 dtype a = np.array([1,2,3],dtype=np.float32) print(a) a2 = np.array([1,2,3],dtype=np.int32) print(a2) [1. 2. 3.] [1 2 3] # 建立特定數據 # 2行3列 a = np.array([[1,2,3],[3,2,1]]) print(a) print(a.shape) print(a.dtype) [[1 2 3] [3 2 1]] (2, 3) int32 # 建立全零數組 # 數據全爲0,3行4列 # 默認爲float a = np.zeros((3,4)) print(a) print(a.dtype) [[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]] float64 # 建立全爲1的數組, 同時也能指定這些特定數據的 dtype: a = np.ones((3,4),dtype=np.int) print(a) print(a.dtype) [[1 1 1 1] [1 1 1 1] [1 1 1 1]] int32 # 建立全空數組, 其實每一個值都是接近於零的數: a = np.empty((3,4)) print(a) print(a.dtype) [[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]] float64 # 用 arange 建立連續數組: # 10-19 的數據,2步長 arange用來建立數組 a = np.arange(10,20,2) print(a) print(a.dtype) [10 12 14 16 18] int32 # 使用 reshape 改變數據的形狀 # 3行4列 ,0到11 a = np.arange(12).reshape((3,4)) print(a) print(a.dtype) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] int32 # 用 linspace 建立線段型數據: # 開始端爲1 ,結束端10,且分割成20個數據,生成線段 a = np.linspace(1,10,20) print(a) print(a.dtype) # 一樣也能進行 reshape 工做: a2 = np.linspace(1,10,20).reshape((4,5)) print('------------------------------------------------------------------') print(a2) print(a2.dtype) [ 1. 1.47368421 1.94736842 2.42105263 2.89473684 3.36842105 3.84210526 4.31578947 4.78947368 5.26315789 5.73684211 6.21052632 6.68421053 7.15789474 7.63157895 8.10526316 8.57894737 9.05263158 9.52631579 10. ] float64 ------------------------------------------------------------------ [[ 1. 1.47368421 1.94736842 2.42105263 2.89473684] [ 3.36842105 3.84210526 4.31578947 4.78947368 5.26315789] [ 5.73684211 6.21052632 6.68421053 7.15789474 7.63157895] [ 8.10526316 8.57894737 9.05263158 9.52631579 10. ]] float64
numpy.asarray(a, dtype = None, order = None)
a 任意形式的輸入參數,能夠是,列表, 列表的元組, 元組, 元組的元組, 元組的列表,多維數組 dtype 數據類型,可選 order 可選,有"C"和"F"兩個選項,分別表明,行優先和列優先,在計算機內存中的存儲元素的順序。
NumPy 最重要的一個特色是其 N 維數組對象 ndarray,它是一系列同類型數據的集合 實例 將列表轉換爲 ndarray: import numpy as np x = [1,2,3] a = np.asarray(x) print(a,type(a),a.dtype) [1 2 3] <class 'numpy.ndarray'> int32
將元組轉換爲 ndarray:函數
將元組列表轉換爲 ndarray:學習
設置了 dtype 參數:數據類型spa
numpy.arange numpy 包中的使用 arange 函數建立數值範圍並返回 ndarray 對象,函數格式以下: numpy.arange(start, stop, step, dtype) import numpy as np x = np.arange(0,5,2,float) print(x) [0. 2. 4.]
numpy.linspacecode
numpy.linspace 函數用於建立一個一維數組,數組是一個等差數列構成的,格式以下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
numpy.logspacehtm
numpy.logspace 函數用於建立一個於等比數列。格式以下:
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
# 切片 顧頭不顧尾,指的索引 a = np.array(range(10)) print(a) # # 從索引 0 開始到索引 10 中止,不包括10,間隔爲 2 print(a[0:10:2]) [0 1 2 3 4 5 6 7 8 9] [0 2 4 6 8]
多維數組一樣適用上述索引提取方法:對象
多維數組是對行的切片blog
# 多維數組一樣適用上述索引提取方法: b = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(b[0]) print(b[1:]) [1 2 3] [[4 5 6] [7 8 9]]
b = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(b[1:3])查詢第二行到第三行的數組
[[4 5 6]
[7 8 9]]
切片還能夠包括省略號 …,來使選擇元組的長度與數組的維度相同。 若是在行位置使用省略號,它將返回包含行中元素的 ndarray。
a = np.array([[1, 2, 3], [3, 4, 5], [6, 7, 8]]) print(a[..., 1]) # 第2列元素 print() print(a[1, ...]) # 第2行元素 print() print(a[..., 1:]) # 第2列及剩下的全部元素 [2 4 7] [3 4 5] [[2 3] [4 5] [7 8]]
整數數組索引
# 如下實例獲取數組中(0,0),(1,1)和(2,0)位置處的元素。 x = np.array([[1, 2], [3, 4], [5, 6]]) y = x[[0, 1, 2], [0, 1, 0]] print('x:',x) print('y:',y) x: [[1 2] [3 4] [5 6]] y: [1 4 5] [0, 1, 2] [0, 1, 0] 組合:(0,0),(1,1)和(2,0)
#如下實例獲取了 4X3 數組中的四個角的元素。 # 行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2]。 x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]) print('咱們的數組是:') print(x) print('\n') rows = np.array([[0, 0], [3, 3]]) print(rows,'\n') cols = np.array([[0, 2], [0, 2]]) print(cols,'\n') y = x[[0, 0, 3, 3],[0, 2,0, 2]] y2 = x[rows, cols] print('這個數組的四個角元素是:') print(y) print(y2)
咱們的數組是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[0 0]
[3 3]]
[[0 2]
[0 2]]
這個數組的四個角元素是:
[ 0 2 9 11]
[[ 0 2]
[ 9 11]]
----------------------------------------------
[0, 0, 3, 3]
[0, 2,0, 2]
行和列:(0,0),(0,2),(3,0),(3,2)
Numpy 中包含了一些函數用於處理數組,大概可分爲如下幾類:
修改數組形狀
翻轉數組
修改數組維度
鏈接數組
分割數組
數組元素的添加與刪除
import numpy as np A = np.arange(3,15) print(A) print(A[3]) [ 3 4 5 6 7 8 9 10 11 12 13 14] 6 # 讓咱們將矩陣轉換爲二維的,此時進行一樣的操做: A = np.arange(3,15).reshape((3,4)) print(A[2]) [11 12 13 14] # 二維索引 print(A[1][1]) 8 # 在Python的 list 中,咱們能夠利用:對必定範圍內的元素進行切片操做, # 在Numpy中咱們依然能夠給出相應的方法: print(A[1, 1:3]) [8 9] # 用for循環進行打印 # 逐行進行打印 for row in A: print(row) [3 4 5 6] [ 7 8 9 10] [11 12 13 14] # 逐列打印,就須要稍稍變化一下 for column in A.T: print(column) [ 3 7 11] [ 4 8 12] [ 5 9 13] [ 6 10 14] # flatten是一個展開性質的函數,將多維的矩陣進行展開成1行的數列 # 而flat是一個迭代器,自己是一個object屬性。 import numpy as np A = np.arange(3,15).reshape((3,4)) print(A.flatten()) [ 3 4 5 6 7 8 9 10 11 12 13 14] for item in A.flat: print(item) 3 4 5 6 7 8 9 10 11 12 13 14
# Numpy array合併 np.vstack() np.hstack() np.newaxis() np.concatenate() # vertical stack自己屬於一種上下合併,即對括號中的兩個總體進行對應操做 import numpy as np A = np.array([1,2,3]) B = np.array([4,5,6]) print(np.vstack((A,B))) [[1 2 3] [4 5 6]] C = np.vstack((A,B)) # 數組的維度,幾行幾列 # A僅僅是一個擁有3項元素的數組(數列),而合併後獲得的C是一個2行3列的矩陣。 print(A.shape,C.shape) (3,) (2, 3) # 左右合併 D = np.hstack((A,B)) # horizontal stack print(D) print(A.shape,D.shape) [1 2 3 4 5 6] (3,) (6,) # 轉置操做 # 具備3個元素的array轉換爲了1行3列以及3行1列的矩陣了。 print(A[np.newaxis,:])# 橫着的 print('--------------') print(A[:,np.newaxis])# 豎着的 [[1 2 3]] -------------- [[1] [2] [3]] import numpy as np A = np.array([1,1,1])[:,np.newaxis]# 豎着的 B = np.array([2,2,2])[:,np.newaxis]# 豎着的 C = np.vstack((A,B)) # vertical stack # 上下合併 D = np.hstack((A,B)) # horizontal stack 左右合併 print(D) [[1 2] [1 2] [1 2]] # 合併操做須要針對多個矩陣或序列時,藉助concatenate函數可能會讓你使用起來比前述的函數更加方便: # axis參數很好的控制了矩陣的縱向或是橫向打印,相比較vstack和hstack函數顯得更加方便。 # 多個array 的縱向或者橫向合併 A = np.array([1,1,1])[:,np.newaxis]# 豎着的 B = np.array([2,2,2])[:,np.newaxis]# 豎着的 C = np.concatenate((A,B,B,A),axis=0) # axis=0 上下合併 print(C) print('維度',C.shape) [[1] [1] [1] [2] [2] [2] [2] [2] [2] [1] [1] [1]] 維度 (12, 1) D = np.concatenate((A,B,B,A),axis=1) # 左右合併 print(D) print('維度',D.shape) [[1 2 2 1] [1 2 2 1] [1 2 2 1]] 維度 (3, 4)
Numpy array 分割 import numpy as np A = np.arange(12).reshape((3, 4)) print(A) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] # 縱向分割 # 參數介紹 split(數組,分割多少片斷,分割方向) print(np.split(A, 2, axis=1))# 垂直方向 [array([[0, 1],[4, 5],[8, 9]]), array([[ 2, 3],[ 6, 7],[10, 11]])] # 橫向分割 print(np.split(A, 3, axis=0))# 水平方向 [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])] # 錯誤的分割 #print(np.split(A, 3, axis=1)) # 不等量的分割 # 在機器學習時常常會須要將數據作不等量的分割,所以解決辦法爲np.array_split() print(np.array_split(A, 3, axis=1)) [array([[0, 1], [4, 5], [8, 9]]), array([[ 2], [ 6], [10]]), array([[ 3], [ 7], [11]])] # 在Numpy裏還有np.vsplit()與橫np.hsplit()方式可用。 print(np.vsplit(A, 3)) #等於 print(np.split(A, 3, axis=0)) print(np.hsplit(A, 2)) #等於 print(np.split(A, 2, axis=1)) [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])] [array([[0, 1], [4, 5], [8, 9]]), array([[ 2, 3], [ 6, 7], [10, 11]])]
Numpy copy & deep copy 1、copy 有關聯性 # = 的賦值方式會帶有關聯性 import numpy as np a = np.arange(4) print(a) b = a c = a d = b # 改變a的第一個值,b、c、d的第一個值也會同時改變。 a[0] = 11 print('a',a) # 確認b、c、d是否與a相同。 print('b',b) print('c',c) print('d',d) [0 1 2 3] a [11 1 2 3] b [11 1 2 3] c [11 1 2 3] d [11 1 2 3] # 一樣更改d的值,a、b、c也會改變。 d[1:3] = [22, 33] # array([11, 22, 33, 3]) print('d',b) print('a',a) print('c',c) print('d',d) d [11 22 33 3] a [11 22 33 3] c [11 22 33 3] d [11 22 33 3] 2、deep copy沒有關聯性 # copy() 的賦值方式沒有關聯性 b = a.copy() # deep copy print('b',b) a[3] = 44 print('a',a) print('b',b) b [11 22 33 3] a [11 22 33 44] b [11 22 33 3]
統計全班的成績
假設一個團隊裏有 5 名學員,成績以下表所示。你能夠用 NumPy 統計下這些人在語文、
英語、數學中的平均成績、最小成績、最大成績、方差、標準差。而後把這些人的總成績
排序,得出名次進行成績輸出。
# int8, int16, int32, int64 四種數據類型可使用字符串 'i1', 'i2','i4','i8' 代替
persontype=np.dtype([('name','S20'),('chinese','i'),('english','i'),('math','i')]) peoples = np.array([("zhangfei",66,85,30),("guanyu",95,85,98), ("zhaoyun",93,92,96),("huangzhong",90,88,77),("dainwei",80,90,90)], dtype=persontype) print(peoples) name = peoples['name'] chinese = peoples['chinese'] english = peoples['english'] math = peoples['math'] print(chinese[0],type(chinese[0])) # 語文、英語、數學中的平均成績、最小成績、最大成績、方差、標準差。而後把這些人的總成績 # 排序,得出名次進行成績輸出。 print(f""" 語文: 平均成績:{np.mean(chinese)} 最小成績:{np.amin(chinese)} 最大成績:{np.amax(chinese)} 方差:{np.var(chinese)} 標準差:{np.std(chinese)} """) print(f""" 英語: 平均成績:{np.mean(english)} 最小成績:{np.amin(english)} 最大成績:{np.amax(english)} 方差:{np.var(english)} 標準差:{np.std(english)} """) print(f""" 數學: 平均成績:{np.mean(math)} 最小成績:{np.amin(math)} 最大成績:{np.amax(math)} 方差:{np.var(math)} 標準差:{np.std(math)} """) s1 = chinese[0]+english[0]+math[0] s2 = chinese[1]+english[1]+math[1] s3 = chinese[2]+english[2]+math[2] s4 = chinese[3]+english[3]+math[3] s5 = chinese[4]+english[4]+math[4] print(s1,type(s1)) atype=([('name','S20'),('sum','i')]) a=np.array([(peoples['name'][0],s1) ,(peoples['name'][1],s2) ,(peoples['name'][2],s3) ,(peoples['name'][3],s4) ,(peoples['name'][4],s5)] ,dtype=atype) print(np.sort(a['sum'])) ---------------------------------------------------------- [(b'zhangfei', 66, 85, 30) (b'guanyu', 95, 85, 98) (b'zhaoyun', 93, 92, 96) (b'huangzhong', 90, 88, 77) (b'dainwei', 80, 90, 90)] 66 <class 'numpy.int32'> 語文: 平均成績:84.8 最小成績:66 最大成績:95 方差:114.96000000000001 標準差:10.721940122944169 英語: 平均成績:88.0 最小成績:85 最大成績:92 方差:7.6 標準差:2.756809750418044 數學: 平均成績:78.2 最小成績:30 最大成績:98 方差:634.56 標準差:25.19047439013406 181 <class 'numpy.int32'> [181 255 260 278 281]
解決字符串的問題
import numpy as np new_type = np.dtype([('name', np.str_, 16), ('chinese', np.int32), ('english', np.int32), ('math', np.int32)]) peoples = np.array([("姓名",66,85,30),("張三",95,85,98), ("獲得",93,92,96),("王子",90,88,77),("隨風倒",80,90,90)], dtype=new_type) print(peoples) ------------------------------------------------------------------ [('姓名', 66, 85, 30) ('張三', 95, 85, 98) ('獲得', 93, 92, 96) ('王子', 90, 88, 77) ('隨風倒', 80, 90, 90)]