numpy是python中做科學計算的基礎庫,重在數值計算,也是大部分python科學計算基礎庫,多用于大型、多維陣列上執行數值運算,類似于matlab的資料方法,這里就不再詳細解釋,可以去查看一下我的matlab相關文章,
創建陣列(矩陣)
創建一維陣列
兩種方式:
import numpy
a=numpy.array([1,2,3,4,5])
b=numpy.arange(1,6)
注意:雖然在print時,樣子與串列很像,但它的型別是numpy.ndarray

資料型別,設定與修改
比也可能注意到了最后的b.dtype,.dtype用來列印陣列中的資料型別,
資料型別包含:

你可以在定義陣列的時候直接指定資料型別:
import numpy
a=numpy.array([1,2,3,4,5],dtype='int8')
print(a,a.dtype)

也可以在定義后修改資料型別:
是強制轉換,
注意,不是真正的修改,原資料實際上是沒動的
源代碼是這樣說的:

import numpy
a=numpy.array([1,2,3,4,5])
print(a,a.dtype)
b=a.astype(dtype='int64')
print(b,b.dtype)

修改小數位數
import random
random.random()#用于產生0-1之間的亂數
round(要改變的陣列,保留小數點后位數)
import numpy
import random
a=numpy.array([random.random() for i in range(10)])
print(a)
b=numpy.round(a,2)
print(b)
多維陣列
類似于串列套串列,詳細的寫法看代碼即可,
import numpy
a=numpy.array([1,2,3])#這是一個一維陣列
b=numpy.array([[1,2,3],[4,5,6],[7,8,9]])#這是一個三維陣列,3行3列
print(a,'\n',b)

查看陣列形狀shape
import numpy
a=numpy.array([1,2,3])#這是一個一維陣列
b=numpy.array([[1,2,3],[4,5,6],[7,8,9]])#這是一個三維陣列,3行3列
print(a.shape,b.shape)
對于一維陣列回傳長度,對于多維陣列回傳維度

修改陣列形狀為a行b列reshape((a,b))
對于高維資料一樣,但是很難理解高于三維的內容,所以,這里只提一下二維和三維陣列,
二維:
import numpy
a1=[1,2,3];a2=[4,5,6]
a=[a1,a2]
a_array=numpy.array(a);print('a_array:','\n',a_array,'\n',a_array.shape)
bb1=[1,2,3];bb2=[3,4,5];bb3=[5,6,7];bb4=[7,8,9]
b1=[bb1,bb2];b2=[bb3,bb4]
b=[b1,b2]
b_array=numpy.array(b);print('b_array:','\n',b_array,'\n',b_array.shape)

接上面的來變換
c=a_array.reshape(3,2)
d=b_array.reshape(2,3,2)
print('c:','\n',c,'\n','d:','\n',d)

指定查詢某一維度


多維陣列按行展開層一維陣列flatten
e=d.flatten()
print(e)

陣列計算
陣列與數計算,陣列中所有元素都應用數的計算,
import numpy
a=numpy.array([[0,1,2],[3,4,5]])
#h=numpy.array([[2,2,2],[2,2,2]])
b=a+2
c=a-2
d=a*2
e=a/2
f=a/0
print('a:','\n',a,'\n','b:','\n',b,'\n','c:','\n',c,'\n','d:','\n',d,'\n','e:','\n',e,'\n','f:','\n',f,'\n')

那么f呢?
和matlab一樣,/0后出現正無窮(INF)和無效(NAN)兩種情況

兩個形狀相同的陣列,對應位置元素進行元素
import numpy
a=numpy.array([[0,1,2],[3,4,5]])
h=numpy.array([[2,4,6],[6,4,2]])
b=a+h
c=a-h
d=a*h
e=a/h
print('a:','\n',a,'\n','b:','\n',b,'\n','c:','\n',c,'\n','d:','\n',d,'\n','e:','\n',e)

兩個陣列只有一個維度相同,在這個維度進行計算,
列數相同,每一行進行計算,
import numpy
a=numpy.array([[0,1,2],[3,4,5]])
h=numpy.array([2,4,6])
b=a+h
c=a-h
d=a*h
e=a/h
print('a:','\n',a,'\n','b:','\n',b,'\n','c:','\n',c,'\n','d:','\n',d,'\n','e:','\n',e)

行數相同,分別計算每一列,
import numpy
a=numpy.array([[0,1,2],[3,4,5]])
h=numpy.array([[2],[4]])
b=a+h
c=a-h
d=a*h
e=a/h
print('a:','\n',a,'\n','b:','\n',b,'\n','c:','\n',c,'\n','d:','\n',d,'\n','e:','\n',e)

陣列的軸

三維陣列

使用numpy讀取資料
了解即可,一般不用,從文本問價讀取,

fname檔案位置
dtype讀取出來的型別
delimiter資料用什么字串分隔
skiprows跳過默寫行,例如表頭之類,
usecols讀取指定的行
unpck是否轉置
必須要寫的fname、delimiter,如果讀入數字較大,可以設定dtype,
陣列操作
轉置
transpsoe
import numpy
a=numpy.array([[1,2],[3,4]])
print('a:','\n',a)
b=a.transpose()
print('b:','\n',b)

或者使用T或swapaxes(1,0)
import numpy
a=numpy.array([[1,2],[3,4]])
print('a:','\n',a)
b=a.T
c=a.swapaxes(1,0)
print('b:','\n',b)
print('c:','\n',c)

索引與切片
注意行列是從0開始數的
抽象表示:

第一個會取到對應的點,第二個是行列相交的位置,

例子:

取某一行
import numpy
a=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
print(a[0])

取某些行這里我加上了對列的索引,
import numpy
a=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
print(a[[0,2],:])

取某一列
import numpy
a=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
print(a[:,[0]])

取某些列
import numpy
a=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
print(a[:,[0,2]])

如果是連續多列也可以2:表示從第三列(行)開始到最后
如果是從2到4行(列),可以寫作1:5
值的更改
直接取出賦值即可,
使用布爾來實作對陣列中滿足條件的值進行更改
假設現在的陣列是:
1 2 3
4 5 6
7 8 9
我現在想把陣列中的5取出修改成0
我們利用布林值來判斷滿足條件的值在哪些位置,然后賦值即可,
import numpy
a=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
a[a==5]=0
print(a)

除此之外還可以使用三元運算子進行賦值,這里給出一個numpy自帶的函式,其他的常規三元運算子就不舉例子了,
import numpy
a=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
b=numpy.where(a<=5,0,1)#小于等于5的賦值為0,大于5的賦值1
print(b)

clip(a,b)裁剪操作
規定最小值a與最大值b,小于a的取a,大于b的取b
import numpy
a=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
b=a.clip(2,6)#小于等于5的賦值為0,大于5的賦值1
print(b)

給元素賦值為NAN
NAN為浮點型,賦值前需要將陣列型別轉化為浮點型,然后賦值numpy.nan即可,
陣列拼接
上下拼接與左右拼接
import numpy
a=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
b=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
c=numpy.vstack((a,b))#豎直拼接
d=numpy.hstack((a,b))#水平拼接
print(c,'\n','\n',d)

行交換與列交換
行交換
import numpy
a=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
a[[1,2],:]=a[[2,1],:]#行交換
print(a)

列交換
import numpy
a=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
a[:,[1,2]]=a[:,[2,1]]#行交換
print(a)

NaN與Inf
nan與inf都是float型別
當我們讀取本地的檔案為float的時候,如果有缺失,就會出現nan
當做了一個不合適的計算的時候(比如無窮大(inf)減去無窮大)
不同位置的nan是不相等的,它本身也不是一個數值!
如何統計陣列中nan的個數
numpy.count_nonzero(array!=array)可以統計nan的個數(array是指要統計的陣列),
這個陳述句把array!=array換成array==num即可統計等于num這個值的元素個數,

numpy常用的語法
axis就是上面的0,1,2
這里面t是陣列,np是numpy的縮寫(不可以直接用,要在import時as np才能這樣寫)

標準差是一組資料平均值分散程度的一種度量,一個較大的標準差,代表大部分數值和其平均值之間差異較大;一個較小的標準差,代表這些數值較接近平均值反映出資料的波動穩定情況,越大表示波動越大,越不穩定,

生成亂數numpy.random–

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/281262.html
標籤:python
