1. 程式人生 > >python之numpy的簡單使用

python之numpy的簡單使用

import numpy as np


'''生成0-1之間符合條件的陣列'''
#生成一個隨機浮點數
a1 = np.random.rand()
# print(a1)
#生成一個二維陣列
a2 = np.random.rand(3,4)
# print(a2)


'''檢視陣列的維度、大小、資料型別'''
# print('陣列的維度:',a2.ndim)
# print('陣列的大小:',a2.shape)
# print('陣列的資料型別:',a2.dtype)


'''生成指定元素區間的陣列,並且可以指定大小'''
#前兩個引數代表資料的區間,第三個引數為陣列大小shape
a3 = np.random.uniform(2,3,(2,5))
# print(a3)

#生成隨機整型陣列
a4 = np.random.randint(2,size=5)
# print(a4)
a5 = np.random.randint(2,size=(2,4))
# print(a5)


'''序列建立'''
a6 = np.array([2,4,5,3])
# print(a6)
a7 = np.array([[3,4],[7,2]],dtype='int32')
# print(a7)


'''建立全是0的額陣列,但是shape必須指定,元組型別,如果是一個整型數字,代表是一個一維陣列'''
#如果不指定型別,預設使用numpy.float64
a8 = np.zeros((4,4),dtype='int8')
# print(a8)
a9 = np.zeros((4,4))
# print(a9)

a10 = np.ones((4,4),dtype='int8')
# print(a10)
a11 = np.ones((4,4))
# print(a11)


'''按照範圍,順序生成'''
# arange  (start, stop, step,dtype)
# np.arange(1,100,10) ==  np.array(range(1,100,10))
a12 = np.arange(1,100,10)
# print(a12)
a13 = np.array(range(1,100,10))
# print(a13)


'''重新調整維度'''
'''方法一'''
a14 = np.zeros((3,4))
# print(a14)
a15 = a14.reshape((2,2,3))
# print(a15)
# print(a15.ndim)
# print(a15.shape)
a16 = a14.reshape((2,6))
# print(a16)
'''方法二'''
# print(a16.T)



'''打亂順序'''
a17 = np.arange(1,100,10)
a18 = np.random.shuffle(a17)
# print(a17)
# print(a18)
#舒服之後,原來的資料做了打亂處理,慎重,在原有陣列基礎上


'''numpy的資料型別'''
'''
   名稱	         描述
    bool_	布林型資料型別(True 或者 False)
    int_	預設的整數型別(類似於 C 語言中的 long,int32 或 int64)
    intc	與 C 的 int 型別一樣,一般是 int32 或 int 64
    intp	用於索引的整數型別(類似於 C 的 ssize_t,一般情況下仍然是 int32 或 int64)
    int8	位元組(-128 to 127)
    int16	整數(-32768 to 32767)
    int32	整數(-2147483648 to 2147483647)
    int64	整數(-9223372036854775808 to 9223372036854775807)
    uint8	無符號整數(0 to 255)
    uint16	無符號整數(0 to 65535)
    uint32	無符號整數(0 to 4294967295)
    uint64	無符號整數(0 to 18446744073709551615)
    float_	float64 型別的簡寫
    float16	半精度浮點數,包括:1 個符號位,5 個指數位,10 個尾數位
    float32	單精度浮點數,包括:1 個符號位,8 個指數位,23 個尾數位
    float64	雙精度浮點數,包括:1 個符號位,11 個指數位,52 個尾數位
    complex_	complex128 型別的簡寫,即 128 位複數
    complex64	複數,表示雙 32 位浮點數(實數部分和虛數部分)
    complex128	複數,表示雙 64 位浮點數(實數部分和虛數部分)

'''


'''astype更改資料型別,如果沒有設定copy,返回值為一個新的陣列'''
a19 = np.random.randint(1,12,(1,2),dtype='uint8')
# print(a19)
# print(a19.dtype)
a20 = a19.astype(np.float64)
# print(a20)
# print(a20.dtype)


'''陣列運算'''
a21 = [[1,2,3,4],[1,2,3,4]]
a22 = [[5,2,3,4],[5,2,3,4]]
#列表相加
# print(a21+a22)
s1 = np.array(a21)
s2 = np.array(a22)
#陣列乘以一個常數
s3 = s1*10
# print(s3)
#多維陣列和多維陣列相乘
# print(s1*s2)
#陣列加法
# print(s1+s2)
'''    
    一維陣列與一維陣列:保證元素的個數必須相同
    多維陣列與多維陣列:注意形狀,相同的維度大小和維度個數
    一維陣列與多維陣列:注意一維陣列的形狀問題
'''



'''一維陣列的切片和索引'''
s4 = np.array([1,2,3])
# 索引類似列表,下標從0 開始
# print(s4[2])
#全部擷取
# print(s4[:])
#從2位開始,擷取到最後
# print(s4[1:])
#從開始擷取到最後,步長為2
# print(s4[::2])



'''多維陣列的切片和取值'''
s5 = np.array([[1,2,3],[4,5,6],[7,8,9]])
# print(s5)

#取單值
#按照列表思想取值
# print(s5[1][1])
#按照陣列思維取值
# print(s5[1,1])

#取多值
#以,為界,前面的是列標,後面的是行標,注意,索引以0開始,並且類似左閉又開
# print(s5[0:2,1:3])
#擷取所有一維陣列的第2、3個
# print(s5[:,1:3])
#擷取不連續的多行多列
# print(s5[::2,1:])


'''numpy 的計算函式'''
#向上取整數,並保持資料型別不改變
s6 = np.random.uniform(-5,10,(3,4))
s7 = np.ceil(s6)
# print(s6)
# print(s7)
#向下取整 np.floor()
#四捨五入 np.rint()
#平方   np.square()
#平方根  np.sqrt()



'''將陣列分為兩個部分,一個是小數部分,一個是整數部分'''
# print(s6)
# print(np.modf(s6)[0])
# print(np.modf(s6)[1])



'''判斷是否為空值,判斷每一個元素'''
s8 = np.isnan(s6)
# print(s8)


'''條件篩選'''
s9 = np.array([ 0, -1,  2, -1,  4,-1,  6, -1,  8, -1]).reshape((2,5))
# print(s9)
#where的用法:迭代判斷陣列的每一個元素是否符合條件判斷,如果符合,返回該元素,不符合,則返回預設值
s10 = np.where((s9%2==0),s9,9)
# print(s10)



'''zip的用法'''
#2 zip(o1,o2)把對應位置上的兩個物件壓縮成一個元組
# 將陣列轉列表:s2.tolist()
s11 = np.array([1,3,2,4,9,8,7,-1,-2,-2]).reshape((2,5))
# print(s11)
s12 = np.array([1,2,-7,8,9,4,7,-1,3,-2]).reshape((2,5))
# print(s12)

#where
s13 = np.where(s11>s12,s11,s12)
# print(s13)

#zip
s11_list = s11.reshape(10,).tolist()
# print(s11_list)
s12_list = s12.reshape(10,).tolist()
# print(s12_list)
list3 = [x if x>y else y for x,y in zip(s11_list,s12_list)]
# print(list3)
# print(np.array(list3).reshape((2,5)))



'''使用uniform,生成10,40之間的陣列,組成(3,4)陣列,找出所有四捨五入之後,大於20 ,並且小於30的數字,修改成50,其他數字不變,組成新的陣列'''
#(1)
s17 = np.random.uniform(10,40,(3,4)).round()
# print(s17)
s14 = np.where((s17>20)&(s17<30),50,s17)
# print(s14)
#(2)
s15 = np.random.uniform(10,40,(3,4))
# print(s15)
s16 = np.where((np.rint(s15)>20)&(np.rint(s15)<30),50,np.rint(s15))
# print(s16)



'''numpy的常用函式'''
'''
#裡面可以新增引數axis選擇行列的資料
    求和: np.sum
    求平均:np.mean
    求最大值:np.max
    求最小值:np.min
    求方差:np.var
    求標準差: np.std
    求最大值的下標:np.argmax
'''



'''元素判斷'''
s20 = np.array([1,2,-7,8,9,4,7,-1,3,-2]).reshape((2,5))
# print(s20)
#如果可迭代物件中有一個符合條件就輸出True
# print(np.any(s20<5,axis=0))
#如果可迭代物件中全部符合條件就輸出True
# print(np.all(s20<5,axis=0))



'''陣列的操作'''
#    追加一個元素,會對多維陣列進行降維操作
#     一維陣列追加單個元素,列表或者陣列,返回的也是一維陣列
#     多維陣列也是一樣返回一維陣列
d1 = np.arange(10,20)
d2 = d1.reshape((2,5))
# print(d1)
# print(d2)
#追加元素 ,如果是一維陣列,不需要呼叫到axis這個引數
d3 = np.append(d1,20)
# print(d3)
# 多維陣列的追加,降維成一維陣列,將元素追加到末尾
d4 = np.append(d2,20)
# print(d4)
# 一維陣列追加列表
d5 = np.append(d1,[20,21])
# print(d5)
# 一維陣列和多維陣列相追加,降維,加入到末尾
d6 = np.append(d2,d1)
d7 = np.append(d1,d2)
# print(d6)
# print(d7)



#insert的運用
d8 = np.insert(d1,0,100)
# print(d8)
d9 = np.insert(d1,0,100,axis=0)
# print(d9)
d10 = np.insert(d2,0,100)
# print(d10)
d11 = np.insert(d2,0,100,axis=0)
# print(d11)


#delete函式的使用問題
#一維陣列
d12 = np.delete(d1,0,axis=0)
# print(d12)
d13 = np.delete(d1,[0,1],axis=0)
# print(d13)
#多維陣列
d12 = np.delete(d2,0,axis=1)
# print(d12)
d13 = np.delete(d2,[0,1],axis=1)
# print(d13)



'''數組合並'''
f1 = np.arange(10,20)
f2 = np.arange(30,40)
# 二維陣列
f3 = f1.reshape((2,5))
f4 = f2.reshape((2,5))
# print(f1)
# print(f2)
# print(f3)
# print(f4)
f5 = np.concatenate((f1,f2))
# print(f5)
f6 = np.concatenate((f3,f4))
# print(f6)



'''集合的問題'''
list01 = [1,1,1,1,2,3,4,5,12,12,13,7,8,9,9,9]
# print(list01)
# print(len(list01))
q1 = np.array(list01)
#一維陣列去重
q2 = np.unique(q1)
# print(q2)
#多維陣列去重,降維成一位陣列去重



#求並集的情況
# 一維陣列的並集,去重並且排序
# 多維陣列求並集降維,去重並且排序
# np.union1d()


#求交集的情況
# np.intersect1d()