Numpy

Numpy 屬性

  • 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)

axis=0 與 axis=1 的區分

就是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 從已有的數組建立數組

 
 
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 從數值範圍建立數組

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]]

NumPy 高級索引

整數數組索引

# 如下實例獲取數組中(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)

NumPy 高級索引

#如下實例獲取了 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 數組操做

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合併

# 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分割

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

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)]
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息