本章內(nèi)容:
- 為什么選擇Numpy
- ndarray對象
- 數(shù)據(jù)類型與數(shù)組計算
- 數(shù)組中的軸
- 數(shù)組索引與切片
- 數(shù)組的修改、添加
一坏晦、為什么選擇numpy
numpy支持常見的數(shù)組與矩陣操作。對于同樣的數(shù)值計算任務(wù)球碉,使用numpy比直接使用python要簡潔仓蛆,其使用ndarray對象作為數(shù)據(jù)容器來處理多維數(shù)組,該對象是兼具快速而靈活的數(shù)據(jù)容器豆拨。由于numpy中使用C的API實現(xiàn)能庆,依靠連續(xù)內(nèi)存操作,比python內(nèi)置類型list要有更優(yōu)異的性能搁胆。
二、ndarray對象
只能存放同一類型的數(shù)據(jù)攀例,可設(shè)計為多維數(shù)組顾腊。
可以通過多種方式創(chuàng)建:
示例:
import numpy as np
list1 = [1,2,3,4]
oneArray = np.array(list1)
print(type(oneArray))
print(oneArray)
'''
<class 'numpy.ndarray'>
[1 2 3 4]
'''
oneArray = np.eye(3,3)
print(oneArray)
'''
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
'''
常用屬性:
print(oneArray.ndim)
print(oneArray.shape)
print(oneArray.size)
'''
2
(3, 3)
9
'''
調(diào)整形狀:
arr = np.array([[1,2,3],[4,5,6]])
arr.shape = (3,2)
arr = arr.reshape(3,2)
'''
array([[1, 2],
[3, 4],
[5, 6]])
'''
arr = arr.reshape((6,),order = 'F')
arr
'''
F按列展開(C按行展開):
array([1, 3, 5, 2, 4, 6])
'''
與python list轉(zhuǎn)換
a= np.array([9, 12, 88, 14, 25])
list_a = a.tolist()
print(list_a)
print(type(list_a))
'''
[9, 12, 88, 14, 25]
<class 'list'>
'''
三投慈、數(shù)據(jù)類型與數(shù)組計算
獲取字節(jié)單位長度itemsize:
f = np.array([1,2,3,4,5], dtype = np.int16)
# 返回數(shù)組中每個元素的字節(jié)單位長度
print(f.itemsize)
# 獲取數(shù)據(jù)類型
print(f.dtype)
'''
2
int16
'''
調(diào)整數(shù)據(jù)類型astype:
f = f.astype(np.float64)
print(f.dtype)
'''
float64
'''
生成隨機小數(shù)并保留小數(shù)點后兩位:
print(np.round(np.random.random(),2))
arr = np.array([np.random.random() for i in range(10)])
print(np.round(arr,2))
'''
0.37
[0.27 0.78 0.78 0.78 0.44 0.89 0.47 0.87 0.72 0.41]
'''
計算過程中由于廣播機制冠骄,加減乘除操作會在所有元素上進(jìn)行:
t1 = np.arange(24).reshape((6,4))
print(t1,end='\n\n')
print(t1+2,end='\n\n')
print(t1*2,end='\n\n')
print(t1/2,end='\n\n')
'''
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]
[14 15 16 17]
[18 19 20 21]
[22 23 24 25]]
[[ 0 2 4 6]
[ 8 10 12 14]
[16 18 20 22]
[24 26 28 30]
[32 34 36 38]
[40 42 44 46]]
[[ 0. 0.5 1. 1.5]
[ 2. 2.5 3. 3.5]
[ 4. 4.5 5. 5.5]
[ 6. 6.5 7. 7.5]
[ 8. 8.5 9. 9.5]
[10. 10.5 11. 11.5]]
'''
注意:不同形狀的兩個多維數(shù)組不能計算加袋!
行數(shù)或列數(shù)相同的一維數(shù)組與多維數(shù)組可以計算:
# 行形狀相同:廣播
t1 = np.arange(24).reshape((4,6))
t2 = np.arange(0,6)
print(t1)
print(t2)
print(t1-t2)
'''
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[0 1 2 3 4 5]
[[ 0 0 0 0 0 0]
[ 6 6 6 6 6 6]
[12 12 12 12 12 12]
[18 18 18 18 18 18]]
'''
四职烧、數(shù)組中的軸
什么是軸?
二維:
三維:
沿軸向計算:
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
# 二維
print(np.sum(a,axis = 0))
print(np.sum(a,axis = 1))
print(np.sum(a))
# 三維
a = np.arange(27).reshape(3,3,3)
print(a)
b = np.sum(a,axis=0)
print(b)
'''
[5 7 9]
[ 6 15]
21
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
[[27 30 33]
[36 39 42]
[45 48 51]]
'''
五蝗敢、數(shù)組的索引與切片
多維數(shù)組中的切片方法:
數(shù)據(jù):
t1 = np.arange(24).reshape(4,6)
print(t1)
'''
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
'''
1足删、取一行
# (一行代表是一條數(shù)據(jù),索引也是從0開始的)
print(t1[1])
print(t1[1,:])
'''
[ 6 7 8 9 10 11]
'''
2讶泰、取連續(xù)行列
形式:數(shù)組[行(可以使用切片)拂到,列(可以使用切片)]
# 取連續(xù)的多行
print(t1[1:])
print(t1[1:3,:])
'''
[[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 6 7 8 9 10 11]
[12 13 14 15 16 17]]
'''
3、取非連續(xù)行列
形式:數(shù)組[行(可以使用切片)兄旬,列(可以使用切片)]
print(t1[[0,2,3]])# 取不連續(xù)的多行
print(t1[[0,2,3],:])# 取不連續(xù)的多行
print(t1[:,1])# 取一列
print(t1[:,1:])# 連續(xù)的多列
print(t1[:,[0,2,3]])# 取不連續(xù)的多列
'''
[[ 0 1 2 3 4 5]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 0 1 2 3 4 5]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[ 1 7 13 19]
[[ 1 2 3 4 5]
[ 7 8 9 10 11]
[13 14 15 16 17]
[19 20 21 22 23]]
[[ 0 2 3]
[ 6 8 9]
[12 14 15]
[18 20 21]]
'''
4领铐、取值
形式:數(shù)組[行(可以使用切片),列(可以使用切片)]
print(t1[2,3])
print(t1[[0,1,1],[0,1,3]])
'''
15
[0 7 9]
'''
六罐孝、數(shù)組的修改、添加汹来、刪除與去重
1改艇、修改
在上一節(jié)的索引與切片操作后直接賦值,如果是多行多列會廣播進(jìn)行修改谒兄,如果是不相鄰的點則直接修改值。
布爾mask:
可以用已有的ndarray布爾矩陣作為條件來過濾目標(biāo)矩陣中的元素。
形成布爾mask的方法:
t = np.arange(24).reshape(4,6)
print(t)
# 可以根據(jù)條件修改鸥咖,比如講小于10的值改掉
t[t<10]=0
t[t<10]
# 使用邏輯判斷
np.logical_and &
np.logical_or |
np.logical_not ~
t[(t>2)&(t<6)]=0 # 與
t[(t<2)|(t>6)]=0 # 或
t[~(t>6)]=0 # 非
print(t)
或采用三目運算符:
# 三目運算( np.where(condition, x, y)滿足條件(condition)兄世,輸出x,不滿足輸出y鸥拧。))
score = np.array([[80,88],[82,81],[75,81]])
result = np.where(score>80,True,False)
print(result)
'''
[[False True]
[ True True]
[False True]]
'''
2削解、添加
(1)使用append函數(shù)
沿軸0方向進(jìn)行添加:
a = np.array([[1,2,3],[4,5,6]])
print (np.append(a, [[7,8,9]],axis = 0))
'''
[[1 2 3]
[4 5 6]
[7 8 9]]
'''
沿軸1方向進(jìn)行添加:
a = np.array([[1,2,3],[4,5,6]])
print (np.append(a, [[5,5,5],[7,8,9]],axis = 1))
'''
[[1 2 3 5 5 5]
[4 5 6 7 8 9]]
'''
不說明軸,直接展開添加:
print (np.append(a, [7,8,9]))
'''
[1 2 3 4 5 6 7 8 9]
'''
(2)使用insert函數(shù)(需要提供一個索引值)
不給axis參數(shù)就直接insert
a = np.array([[1,2],[3,4],[5,6]])
print(np.insert(a,3,[11,12]))
'''
[ 1 2 3 11 12 4 5 6]
'''
沿軸0廣播:
a = np.array([[1,2],[3,4],[5,6]])
print(np.insert(a,3,[11]),axis = 0)
'''
[[ 1 2]
[ 3 4]
[ 5 6]
[11 11]]
'''