np模塊性能比較
算出1億條 list的元素總和
import random
import time
import numpy as np
a = []
for i in range(100000000):
a.append(random.random())
#獲取當前時間
t1 = time.time()
sum1=sum(a)
#獲取當前時間
t2=time.time()
b=np.array(a)
t4=time.time()
sum3=np.sum(b)
t5=time.time()
print(t2-t1, t5-t4)
0.34258532524108887 0.0359797477722168
創建ndarray(array,asarray)
array,asarray創建比較區別
創建ndarray有兩種方法 array,asarray
主要區別就是當數據源是ndarray時,array仍然會copy出一個副本,佔用新的內存,但asarray不會
下面代碼做了一個比較可以參考:
import numpy as np
list1 = [1,2,3,4]
oneArray = np.array(list1)
print(type(oneArray))
print(oneArray)
AArray=np.asarray(oneArray)
BArray=np.array(oneArray)
print (oneArray,id(oneArray))
print (AArray,id(AArray))
print (BArray,id(BArray))
<class ‘numpy.ndarray’>
[1 2 3 4]
[1 2 3 4] 139721625138640
[1 2 3 4] 139721625138640
[1 2 3 4] 139721625137680
創建ndarray數組的多種形式
直接傳入列表的方式
t1 = np.array([1,2,3])
print(t1)
print(type(t1))
[1 2 3]
<class ‘numpy.ndarray’>
傳入range生成序列
t2 = np.array(range(10))
print(t2)
print(type(t2))
[0 1 2 3 4 5 6 7 8 9]
<class ‘numpy.ndarray’>
使用numpy自帶的np.arange()生成數組
t3 = np.arange(0,10,2)
print(t3)
print(type(t3))
[0 2 4 6 8]
<class ‘numpy.ndarray’>
ndarray 一維 二維 三維
shape屬性可以獲取矩陣的形狀(例如二維數組的行列),獲取的結果是一個元組
一維
import numpy as np
v1=np.array([1,2,3])
#輸出數組的行和列數
print(v1.shape)
#只輸出行數
print(v1.shape[0])
print(v1[0])
print(v1[0:])
(3,)
3
1
[1 2 3]
二維(兩種情況)
第一種
import numpy as np
v2=np.array([[1,2,3],[4,5,6]])
print (v2)
print(v2.shape)
#只輸出行數
print(v2.shape[0])
#只輸出列數
print(v2.shape[1])
print(v2[0])
print(v2[0][0])
print(v2[0:1,0:2]) #逗號前選取行(前取後不取),逗號後選取列
[[1 2 3]
[4 5 6]]
(2, 3)
2
3
[1 2 3]
1
6
第二種 (有疑問)
v2=np.array([[1,3],[4,5,6]])
print (v2)
print(v2.shape)
print(v2[0])
print(v2[0][0])
print(v2[0:1])
[list([1, 3]) list([4, 5, 6])]
(2,)
[1, 3]
1
[list([1, 3])]
三維
v3=np.array([[[1,2,3],[1,2,0]],[[5,6,7],[9,8,7]]])
print (v3)
print(v3.shape)
print(v3[1][1][0])
print(v3[1][1])
print(v3[1])
print(v3[0:1,1:2,1:2]) #選取行列深度
[[[1 2 3]
[1 2 0]]
[[5 6 7]
[9 8 7]]]
(2, 2, 3)
9
[9 8 7]
[[5 6 7]
[9 8 7]]
[[[2]]]
ndarray其它屬性
list2 = [[1,2],[3,4],[5,6]]
twoArray = np.array(list2)
print(twoArray)
[[1 2]
[3 4]
[5 6]]
ndim(獲取數組的維度)
print(twoArray.ndim)
2
shape(獲取矩陣的形狀 返回元組)
print(twoArray.shape)
(3, 2)
size(有多少個元素)
print(twoArray.size)
6
tolist() (轉換成list)
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’>
sum() 計算所有的值的和
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(np.sum(a))# 計算所有的值的和
21
修改ndarray
four = np.array([[1,2,3],[4,5,6]])
print(four)
[[1 2 3]
[4 5 6]]
修改的是原有的矩陣 shape
four.shape = (3,2)
print(four)
[[1 2]
[3 4]
[5 6]]
返回一個新的數組 reshape
five = four.reshape(3,2)
print(five)
[[1 2]
[3 4]
[5 6]]
多維變成一維數組 order F C 風格
默認情況下‘C’以行爲主的順序展開,‘F’(Fortran風格)意味着以列的順序展開
four = np.array([[1,2,3],[4,5,6]])
print(four)
five = four.reshape((6,),order='C')
# # 默認情況下‘C’以行爲主的順序展開,‘F’(Fortran風格)意味着以列的順序展開
six = four.flatten(order='F')
print(five)
print(six)
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]
[1 4 2 5 3 6]
轉換成三維
t = np.arange(24)
print(t)
# # 轉成三維 -- 兩個元素(兩個二維數組) 一個二維數組 3行 一個二維數組 3列
t2 = t.reshape((2,3,4))
print(t2)
print(t2.shape)
print (t2.ndim)
[ 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 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
(2, 3, 4)
3
數組的運算
單數組運算
t1 = np.arange(24).reshape((6,4))
print(t1)
print(t1+2)
print(t1*2)
print(t1/2)
[[ 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]]
多個數組運算 (行列必須相同)
t1 = np.arange(24).reshape((6,4))
t2 = np.arange(100,124).reshape((6,4))
print(t1)
print(t2)
print(t1+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]]
[[100 101 102 103]
[104 105 106 107]
[108 109 110 111]
[112 113 114 115]
[116 117 118 119]
[120 121 122 123]]
[[100 102 104 106]
[108 110 112 114]
[116 118 120 122]
[124 126 128 130]
[132 134 136 138]
[140 142 144 146]]
行形狀相同(會與每一行數組的對應位相操作)
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 2 4 6 8 10]
[ 6 8 10 12 14 16]
[12 14 16 18 20 22]
[18 20 22 24 26 28]]
列形狀相同(會與每一個相同維度的數組的對應位相操作)
t1 = np.arange(24).reshape((4,6))
t2 = np.arange(4).reshape((4,1))
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]]
[[ 0 1 2 3 4 5]
[ 7 8 9 10 11 12]
[14 15 16 17 18 19]
[21 22 23 24 25 26]]
每個值都運算相同的方法
t1 = np.arange(6).reshape((3,2))
t2 = np.arange(4).reshape((4,1))
print (t1)
print (t2)
print (t1+2)
print (t2+10)
[[0 1]
[2 3]
[4 5]]
[[0]
[1]
[2]
[3]]
[[2 3]
[4 5]
[6 7]]
[[10]
[11]
[12]
[13]]
axis 軸的計算
二維
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a)
# axis軸 個人理解 0爲豎軸相加 1爲橫軸相加
print(np.sum(a,axis=0))
print(np.sum(a,axis = 1))
[[1 2 3]
[4 5 6]]
[5 7 9]
[ 6 15]
21
三維
a = np.arange(27).reshape((3,3,3))
print(a)
b = np.sum(a, axis=0) # 0 穿透相加
print(b)
c = np.sum(a, axis=1) # 1 數軸相加
print(c)
d = np.sum(a, axis=2) # 2 橫軸相加
print(d)
[[[ 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]]
[[ 9 12 15]
[36 39 42]
[63 66 69]]
[[ 3 12 21]
[30 39 48]
[57 66 75]]
切片
一維切片
import numpy as np
#numpy 提供的類似python_range方法
a = np.arange(10)
print(a)
# 冒號分隔切片參數 start:stop:step 來進行切片操作
print(a[2:7:2])# 從索引 2 開始到索引 7 停止,間隔爲 2
# # 如果只放置一個參數,如 [2],將返回與該索引相對應的單個元素
print(a[2])
# # 如果爲 [2:],表示從該索引開始以後的所有項都將被提取
print(a[2:])
[0 1 2 3 4 5 6 7 8 9]
[2 4 6]
2
[2 3 4 5 6 7 8 9]
二維切片 (行)
import numpy as np
t1 = np.arange(24).reshape(4,6)
print(t1)
print('*'*20)
print(t1[1]) # 取一行(一行代表是一條數據,索引也是從0開始的)
print('*'*20)
print(t1[1,:]) # 取一行 [行數:,列數:]
print('*'*20)
print(t1[1:])# 取連續的多行 [行:]
print('*'*20)
print(t1[1:3,:])# 取連續的多行 0
print('*'*20)
print(t1[[0,2,3]])# 取不連續的多行
print('*'*20)
print(t1[[0,2,3],:])# 取不連續的多行
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[ 6 7 8 9 10 11]
[ 6 7 8 9 10 11]
[[ 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]]
[[ 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]]
二維切片 (列)
import numpy as np
t1 = np.arange(24).reshape(4,6)
print(t1)
print('*'*20)
print(t1[:,1])# 取一列[行]
print(t1[:,1:])# 連續的多列 1: 從第一列開始取,取到最後一列,跳躍的距離(步長爲1)
print(t1[:,[0,2,3]])# 取不連續的多列
print(t1[3-1*2,4-1*2])# # 取某一個值,三行四列 切片可以進行計算
print(t1[[0,1,1],[0,1,3]])# 取多個不連續的值,[[行,行。。。],[列,列。。。]]
[[ 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 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]]
8
[0 7 9]
修改ndarray值
t = np.arange(24).reshape(4,6)
print(t)
# 修改某一行的值
t[1,:]=0
print(t)
# 修改某一列的值
t[:,1]=0
print(t)
# 修改連續多行
t[1:3,:]=0
print(t)
# 修改連續多列
t[:,1:4]=0
print(t)
# 修改多行多列,取第二行到第四行,第三列到第五列
t[1:4,2:5]=0
print(t)
# 修改多個不相鄰的點
t[[0,1],[0,3]]=0
print(t)
t[t<10]=0
print(t)
[[ 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]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 0 0 2 3 4 5]
[ 0 0 0 0 0 0]
[12 0 14 15 16 17]
[18 0 20 21 22 23]]
[[ 0 0 2 3 4 5]
[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]
[18 0 20 21 22 23]]
[[ 0 0 0 0 4 5]
[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]
[18 0 0 0 22 23]]
[[ 0 0 0 0 4 5]
[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]
[18 0 0 0 0 23]]
[[ 0 0 0 0 4 5]
[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]
[18 0 0 0 0 23]]
[[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]
[18 0 0 0 0 23]]
拓展 if判斷
三目運算( np.where(condition, x, y)滿足條件(condition),輸出x,不滿足輸出y。))
#列表生成式 --- > if else
score = np.array([[80,88],[82,81],[75,81]]) #分數 # 如果學生的分數大於八十 優秀的學習 (true,false)
print(score)
result = np.where(score>80,True,False)
print(result)
[[80 88]
[82 81]
[75 81]]
[[False True]
[ True True]
[False True]]