python包介绍:numpy
1 ndarray
相比于python中的list,ndarray的核心優勢就是運算快
Numpy?喜歡用電腦內存中連續的一塊物理地址存儲數據
?Python?的?List?并不是連續存儲的,它的數據是分散在不同的物理空間(list中的類型可以是不一樣的)
1.1 創建
np.array(object,dtype=…) | 用object創建ndarray ? | ||||||
empty(shape,dtype=)empty_like(data) | 指定形狀&類型,元素值均為隨機值 | ||||||
zeros(shape,dtype=)zeros_like(data) | 填充0 | ||||||
onesones_like(data) | 填充1 | ||||||
full(shape,num,dtype)full_like(data,num) | 用num填充shape大小的數組 | ||||||
eye(num,dtype)等同于identity(num,dtype) | num*num的單位矩陣 | ||||||
random.random(shape,dtype) | |||||||
numpy.random.normal(loc,scale,size) | 正態分布
| ||||||
diag | 當?np.diag(array)?中 array是一個1維數組時,結果形成一個以一維數組為對角線元素的矩陣 array是一個二維矩陣時,結果輸出矩陣的對角線元素 | ||||||
empty_like(x) | 創建一個形狀和x一樣的,數值隨機 | ||||||
arange(start, stop, step, dtype) | ?? | ||||||
linspace | 創建一個等差數列 ? ? | ||||||
logspace | 創建一個等比數列 ? |
?1.2?ndarray 屬性
ndim | 矩陣維數 | |
shape | 數組的維度(元組形式)【用reshape調整大小】 | |
itemsize | 一個元素的大小(占幾個字節) | |
real | 元素的實部 | |
imag | 元素的虛部 | |
dtype | 數據類型 | |
size | 元素個數 |
1.3 切片
| a[start:end:step] | 左閉右開 |
| a[…,x]——第x+1列 a[x,…]——第x+1行 | |
| a[[list1],[list2]] | 獲取 (list1[0].list2[0]) (list1[1].list2[1]) (list1[2].list2[2]) ….等索引位置的數據 ? |
| a[list] | 獲取list中這幾行元素 |
| a[np.ix_([list1],[list2])] | 獲取第list1行的第list2列的數據 ? |
1.3.1 切片的性質?
切片是原來的array的一個視圖,修改切片的話,原來的也改變了
!!!記住結論:!!!
如果是數字/帶數字的':'來切片的話,不論是不是有塌縮(類似于r1那樣的變成一維的)都是原來的的一個view,元素修改了就一起修改了
如果是數組這樣的索引切片的話(注:元組tuple不行),那么就是copy不是view了
如果是混合的(一個數組,一個純數字),那么就是copy(因為有數組切片了)
import numpy as np a=np.array([[1,2,3],[3,4,5],[7,8,9]]) b=a[1,:] c=a[[1],:] d=a[1:2,:] print(a,'\n',b,c,d) ''' [[1 2 3][3 4 5][7 8 9]] [3 4 5] [[3 4 5]] [[3 4 5]] ''' b[1]=10 print(a,'\n',b,c,d) ''' [[ 1 2 3][ 3 10 5][ 7 8 9]] [ 3 10 5] [[3 4 5]] [[ 3 10 5]] '''?1.4 布爾索引
?
?
?2? 數組運算
?執行數組的運算必須有相同的行列/符合廣播規則
2.1 相同行列
相同行列:對應元素加減乘除
?
?
2.2 廣播原則?
?當運算中的 2 個數組的形狀不同時,numpy 將自動觸發廣播機制
2.2.1 數組+標量
?
?
?2.2.2 數組+行/列
?
3 內積外積與矩陣乘法?
?3.1 外積
?
?3.2 內積
內積——inner/dot
?np.dot(a,b)等價于a.dot(b)
inner用法和dot稍有不同:?np.dot(a, b)= np.inner(a, b.T),相當于b做一次轉置
3.3 乘法
matmul/@/dot
?4 函數
all | 矩陣中元素是否全部非零 | ||||||||||||||||||
any | 矩陣中是否有元素非零 | ||||||||||||||||||
argmax/argmin | 第幾維度的最大最小值的坐標 Argmax[0]:對每一個a[…][0][0],a[…][0][1],a[…][0][2] a[…][1][0],a[…][1][1],a[…][1][2]找一個最大值 | ||||||||||||||||||
count_nonzero() | 統計非零元素值 | ||||||||||||||||||
floor | 向下取整 | ||||||||||||||||||
ceil | 向上取整 | ||||||||||||||||||
prod | 所有元素乘積結果 | ||||||||||||||||||
argsort | argsort函數返回的是數組值從小到大的索引值
? b——正序 -b——倒序 如果是多維的話(默認是最大的一個axis) Axis=0 a[..][0][0],a[…][0][1],a[…][0][2] a[..][1][0],a[…][1][1],a[…][1][2] Axis=1 a[0][…][0],a[0][…][1],a[0][…][2] Axis=2同理 | ||||||||||||||||||
copy | 這個是真copy,不是view | ||||||||||||||||||
clip | 截取數組中在min和max之間的部分,比min小的置為min,比max大的置為max | ||||||||||||||||||
cumsum/cumprod | 括號是幾——第幾維度累加/累乘(a[][][][]里面的第幾個,從左往右) 括號里是0:原第一行=原第一行 ? 原第二行=原第二行+原第一行 ? 原第三行=原第三行+原第二行+原第一行 括號里是1:列的操作 沒有字母,所有元素,一個一個疊加 | ||||||||||||||||||
diff | 類差運算 | ||||||||||||||||||
flatten | 返回一份數據拷貝,對拷貝所做的修改不影響原始數組 F風格:按列展開 flat 一個迭代器 | ||||||||||||||||||
np.isin(a,b) | ?用于判定a中的元素在b中是否出現過,如果出現過返回True,否則返回False,最終結果為一個形狀和a一模一樣的數組。 和np.where搭配使用,效果更好(np.where返回True的坐標) 分別是我找到的1的第一維坐標和第二位坐標 | ||||||||||||||||||
nditer | 按照ndarray在內存中的存儲順序逐個訪問 a和a轉置在內存中的存儲順序一樣——他們的遍歷順序一樣 默認order=’C‘行優先 ——order=“F’(fortran 列優先)? | ||||||||||||||||||
meshgrid(ndarray,ndarray) | 返回坐標方格的X與Y x和y都是二維數組,分別是這些點的橫坐標/縱坐標 | ||||||||||||||||||
mean/average | 計算平均數,加axis就是某一個軸, 比如axis=0,就是每一列一個平均數(a[;;;][0],a[,,,,][1],…..,) average只能是np.average | ||||||||||||||||||
median | 中位數 | ||||||||||||||||||
std | 標準差 | ||||||||||||||||||
newaxis | 添加一個維度 感覺還是reshape靠譜一點 | ||||||||||||||||||
ravel | 和flatten差不多,唯一的區別是,修改會影響原始數組 | ||||||||||||||||||
reshape | |||||||||||||||||||
resize | 如果一樣大的話和a.reshape()差不多 shape比a的尺寸小的話,那就是截取 如果尺寸大的話,會把a的元素按照a的順序補進去 | ||||||||||||||||||
np.round | round( number ) 函數會返回浮點數 number 的四舍五入值 具體定義為 round(number[,digits]): 如果 digits>0 ,四舍五入到指定的小數位; 如果 digits=0 ,四舍五入到最接近的整數; 如果 digits<0 ,則在小數點左側進行四舍五入; 如果 round() 函數只有 number 這個參數,則等同于 digits=0。 | ||||||||||||||||||
split | 等量對分 (axis=0 a[1~n][0]會被等分到各個里面去) 一定是等量,不等量的話會報錯 vsplit=split(axis=0) hsplit=split(axis=1) | ||||||||||||||||||
array_split | 不等量分割 | ||||||||||||||||||
np.sin | 逐元素取sin | ||||||||||||||||||
std | 計算標準差 Axis=0——計算a[…][0][0],a[…][0][1],…的標準差 | ||||||||||||||||||
squeeze | 刪除單維度條目 | ||||||||||||||||||
tolist | 轉換為list | ||||||||||||||||||
triu(data,k) | 以data為數據,創建一個上三角矩陣,k表示這個上三角的邊接往上/下移動幾條線的距離 | ||||||||||||||||||
tile | np.tile(a,(2))函數的作用就是將函數將函數沿著X軸擴大兩倍。如果擴大倍數只有一個,默認為X軸 np.tile(a,(2,1))第一個參數為Y軸擴大倍數,第二個為X軸擴大倍數。本例中X軸擴大一倍便為不復制。 | ||||||||||||||||||
np.timedelta(num,'x') | 計算兩個datetime中間差多少時間間隔(向下取整)【Y、M、W、D、h、m、s、ms、us、ns】 | ||||||||||||||||||
轉置 | |||||||||||||||||||
where | numpy.where()?有兩種用法: 1. np.where(condition, x, y) 滿足條件(condition),輸出x,不滿足輸出y。*如果y是數組的話,輸出y相應位置的元素 2. np.where(condition) 只有條件 (condition),沒有x和y,則輸出滿足條件 (即非0) 元素的坐標。 這里的坐標以tuple的形式給出,通常原數組有多少維,輸出的tuple中就包含幾個數組,分別對應符合條件元素的各維坐標。 | ||||||||||||||||||
fromstring | 從string中提取成ndarray ?只能讀取一個數值序列 |
番外篇:理解axis
前面我們提到了axis的用法
Axis=0——
a[..][0][0],a[…][0][1],a[…][0][2]
a[..][1][0],a[…][1][1],a[…][1][2]
Axis=1——
a[0][…][0],a[0][…][1],a[0][…][2]
換一種理解就是:
有兩組數據,它們的維度都是(2,3),即都是兩行三列的數據。
當axis設為0時,表示我們要修改第一個維度的數據,兩組數據的第一個維度都是2,當它們合并時就變成了4,所以合并后的數據的維度就是(4,3),即變成了四行三列。同理,axis設為1,合并后的數據維度就變成了(2,6),即兩行六列~
同理,axis參數在其他方法里也可以用同樣的方法思考,比如求均值的mean方法,當axis設為0時,對第一個維度的數據進行求均值,維度為(2,3)的數據計算完后就變成了維度為(1,3)的數據
5 文件處理
tofile() & fromfile() | tofile()將數組中的數據以二進制格式寫進文件 tofile()輸出的數據不保存數組形狀和元素類型等信息 fromfile()函數讀回數據時需要用戶指定元素類型,并對數組的形狀進行適當的修改 讀入數據的時候,需要設置正確的dtype參數,并且修改屬組的shape屬性,才會得到和原始數據一致的結果 sep參數:tofile 和 fromfile中數值的分隔符 |
save() & load() | NumPy專用的二進制格式保存數據,它們會自動處理元素類型和形狀等信息 |
savez() | 將多個數組保存到一個文件中 savez()的第一個參數是文件名,其后的參數都是需要保存的數組 ?沒有起名的話就是'arr_0","arr_1",....起來名字的就是所起的名字 |
savez_compressed() | 在savez的基礎上 進行一次數據壓縮 ? |
ndarray寫入csv | 先轉化成DataFrame |
savetxt() & loadtxt() |
|
isnan | 判斷ndarray里面的元素是否是NaN |
?python 筆記:愛因斯坦求和 einsum_UQI-LIUWJ的博客-CSDN博客
總結
以上是生活随笔為你收集整理的python包介绍:numpy的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 错误解决 :Microsoft Visu
- 下一篇: 文巾解题 326. 3的幂