數據分析_第二天_numpy的使用

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

發佈了64 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章