目錄
numpy.argmax() 和 numpy.argmin()
numpy.savetxt()與numpy.loadtxt()
參考
將Pandas中的DataFrame類型轉換成Numpy中array類型的三種方法
簡介
詳介
Ndarray 對象
N 維數組對象 ndarray,它是一系列同類型數據的集合,用於存放同類型元素的多維數組。
創建一個 ndarray 只需調用 NumPy 的 array 函數即可:numpy.array()
#創建一維、二維數組
import numpy as np
dim1=np.array([1,2,3])
#[1 2 3]
dim2=np.array([[1,2,3],[4,5,6]]) #注:方括號的數量!
'''
[[1 2 3]
[4 5 6]]
'''
NumPy 數據類型
numpy 支持的數據類型比 Python 內置的類型要多很多,基本上可以和 C 語言的數據類型對應。
numpy 的數值類型實際上是 數據類型對象dtype 的實例。dtype 用來描述與數組對應的內存區域如何使用。
NumPy 數組屬性
NumPy 數組的維數稱爲秩(rank),一維數組的秩爲 1,二維數組的秩爲 2,以此類推。
在 NumPy中,每一個線性的數組稱爲是一個軸(axis),也就是維度(dimensions),而軸的數量——秩,就是數組的維數。。比如說,二維數組相當於是兩個一維數組,其中第一個一維數組中每個元素又是一個一維數組。所以一維數組就是 NumPy 中的軸(axis),第一個軸相當於是底層數組,第二個軸是底層數組裏的數組。
很多時候可以聲明 axis。axis=0,表示沿着第 0 軸進行操作,即對每一列進行操作;axis=1,表示沿着第1軸進行操作,即對每一行進行操作。
Numpy的數組類ndarray的重要函數
-
ndarray.ndim
秩,即軸的數量或維度的數量
-
ndarray.shape
數組的維度。以元組形式返回每一個軸的長度。對於一個n行m列的矩陣, shape即(n,m)
-
ndarray.size
返回數組所有元素的數目。
-
ndarray.dtype
返回數組中元素的數據類型
#reshape改變數組維度ndim(個人:改維度,關鍵在方括號的變化吧)
import numpy as np
a=np.arange(24)#現在a只有一個維度
print(a.ndim)#1
print(a)
#[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
#調整a維度大小
b=a.reshape(2,4,3)#改爲三個維度,2部分+每部分4行3列
print(b.ndim)#3
print(b)
'''
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]]'''
c=a.reshape(2,2,4,3)#改爲四個維度,2部分+2部分+每部分4行3列
print(c.ndim)#4
print(c)
'''
[[[[ 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 28 29]
[30 31 32]
[33 34 35]]
[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]]]'''
#ndarray.shape以及reshape也可以用於調整數組大小
#注:shape與reshape用法不同
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
print(a.shape)#(2, 3)
a.shape=(3,2) #或b=a.reshape(3,2)
print(a)
'''
[[1 2]
[3 4]
[5 6]]
'''
NumPy 創建數組
numpy.empty
import numpy as np
#numpy.empty 方法用來創建一個指定形狀(shape)、數據類型(dtype)且未初始化的數組
x=np.empty([3,2],dtype=int)
print(x)#數組元素爲隨機值,因爲它們未初始化
'''
[[ 543584032 543516788]
[1769104755 537555813]
[ 538976288 1948262432]]
'''
numpy.zeros
import numpy as np
#numpy.zeros創建指定大小的數組,數組元素以 0 來填充(# 默認爲浮點數)
x=np.zeros(5)
print(x)#[0. 0. 0. 0. 0.]
x=np.zeros((2,4,3),dtype=np.int)#2部分 4行 3列
print(x)
'''
[[[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]]]
'''
numpy.ones
#numpy.ones創建指定形狀的數組,數組元素以 1 來填充
import numpy as np
x=np.ones([2,3],dtype=int)# 或 dtype=np.int
print(x)
'''[[1 1 1]
[1 1 1]]'''
NumPy 從已有的數組創建數組
numpy.asarray
import numpy as np
#將列表轉換爲 ndarray(多維數組)
x=[1,2,3]
a=np.asarray(x)
print(a)#[1 2 3]
print(type(a))#<class 'numpy.ndarray'>
numpy.frombuffer
import numpy as np
#numpy.frombuffer 接受 buffer 輸入參數,以流的形式讀入轉化成 ndarray 對
s=b'hello world'#若不加b,則報錯TypeError: a bytes-like object is required, not 'str'
a=np.frombuffer(s,dtype='S1')
print(a)#[b'h' b'e' b'l' b'l' b'o' b' ' b'w' b'o' b'r' b'l' b'd']
numpy.fromiter
import numpy as np
#numpy.fromiter 方法從可迭代對象中建立 ndarray 對象,返回一維數組
#使用list函數創建列表對象
list=range(5)
print(type(list))#<class 'range'>
it=iter(list)
print(type(it))#<class 'range_iterator'>
#使用迭代器創建ndarray
x=np.fromiter(it,dtype=float)
print(x)#[0. 1. 2. 3. 4.]
print(type(x))#<class 'numpy.ndarray'>
NumPy 從數值範圍創建數組
numpy.arange
import numpy as np
x=np.arange(5)
print(x)#[0 1 2 3 4]
xx=np.arange(2,5,1)
print(xx)#[2 3 4]
numpy.linspace等差
numpy.logspace等比
NumPy 切片和索引
ndarray對象的內容可以通過索引或切片來訪問和修改,與 Python 中 list 的切片操作一樣。ndarray 數組可以基於 0 - n(不含n) 的下標進行索引,切片對象可以通過內置的 slice 函數,並設置 start, stop 及 step 參數進行,從原數組中切割出一個新數組。
import numpy as np
x=np.arange(5)
print(x)#[0 1 2 3 4]
s=slice(2,4)
print(x[s])#[2 3]
切片還可以包括省略號,來使選擇元組的長度與數組的維度相同。 如果在行位置使用省略號,將返回包含行中元素的 ndarray。
import numpy as np
a = np.array([[1, 2, 3], [3, 4, 5], [4, 5, 6]])
print(a)
# 從某個索引處開始切割
print('從數組索引 a[1:] 處開始切割')
print(a[1:])
a = np.array([[1, 2, 3], [3, 4, 5], [4, 5, 6]])
print(a[..., 1]) # 第2列元素
print(a[1, ...]) # 第2行元素
print(a[..., 1:]) # 第2列及剩下的所有元素
'''[[3 4 5]
[4 5 6]]
[2 4 5]
[3 4 5]
[[2 3]
[4 5]
[5 6]]'''
~(取補運算符):過濾 NaN
import numpy as np
a = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])#[nan 1. 2. nan 3. 4. 5.]
print(a)
print(a[~np.isnan(a)])#[1. 2. 3. 4. 5.]
NumPy 迭代數組
NumPy 迭代器對象 numpy.nditer 提供了一種靈活訪問一個或者多個數組元素的方式。
迭代器最基本的任務的可以完成對數組元素的訪問。
import numpy as np
#使用 arange() 函數創建一個 2X3 數組,並使用 nditer 對它進行迭代
#迭代輸出數組元素
a=np.arange(6).reshape(2,3)
print('原始數組:',a)#[[0 1 2] [3 4 5]]
for x in np.nditer(a):
print(x,end=',')#0,1,2,3,4,5,
nditer 對象有另一個可選參數 op_flags,可用於修改數組中元素的值。
Numpy 數組操作
修改數組形狀
- numpy.ndarray.flat 是一個數組元素迭代器
import numpy as np
#numpy.ndarray.flat 是一個數組元素迭代器
a=np.arange(9).reshape(3,3)
for row in a:
print(row)
'''[0 1 2]
[3 4 5]
[6 7 8]'''
#對數組中每個元素都進行處理,可以使用flat屬性,該屬性是一個數組元素迭代器
for element in a.flat:
print(element)
'''0
1
2
3
4
5
6
7
8'''
- numpy.ndarray.flatten 返回一份數組拷貝
a=np.arange(9).reshape(3,3)
print(a.flatten())#[0 1 2 3 4 5 6 7 8]
- numpy.ravel() 展平的數組元素
a=np.arange(9).reshape(3,3)
print(a.ravel())#[0 1 2 3 4 5 6 7 8]
翻轉數組
- numpy.transpose 函數用於對換數組的維度
a=np.arange(9).reshape(3,3)
print(a)
'''
[[0 1 2]
[3 4 5]
[6 7 8]]'''
print(a.transpose())#或print(np.transpose(a))
'''[[0 3 6]
[1 4 7]
[2 5 8]]'''
- numpy.rollaxis 函數(滾動軸)向後滾動特定的軸到一個特定位置
import numpy as np
a=np.arange(8).reshape(2,2,2)
print(a)
'''[[[0 1]
[2 3]]
[[4 5]
[6 7]]]'''
#將輸入軸2滾動到軸0(寬度到深度)
print(np.rollaxis(a,2))
'''[[[0 2]
[4 6]]
[[1 3]
[5 7]]]'''
#將輸入軸0滾動到軸1(寬度到高度)
print(np.rollaxis(a,2,1))
'''[[[0 2]
[1 3]]
[[4 6]
[5 7]]]'''
- numpy.swapaxes 函數用於交換數組的兩個軸
修改數組維度
ravel & flatten 將數組變爲一維
- numpy.expand_dims 函數 通過在指定位置插入新的軸來擴展數組形狀
import numpy as np
x=np.array(([1,2],[3,4]))
print(x)
'''[[1 2]
[3 4]]'''
y0=np.expand_dims(x,axis=0)
print(y0)
'''[[[1 2]
[3 4]]]'''#注意方括號的個數、位置變化
y1=np.expand_dims(x,axis=1)
print(y1)
'''[[[1 2]]
[[3 4]]]'''
print(x.shape,y0.shape,y1.shape)#(2, 2) (1, 2, 2) (2, 1, 2)
連接數組
分割數組
數組元素的添加與刪除
NumPy 字符串函數
如numpy.char.capitalize('i love you')
import numpy as np
print(np.char.capitalize('i love you'))#I love you
print(np.char.title('i love you'))#I Love You
NumPy 數學函數
NumPy 包含大量的各種數學運算的函數,包括三角函數,算術運算的函數,複數處理函數等。
NumPy 算術函數
NumPy 算術函數包含簡單的加減乘除: add(),subtract(),multiply() 和 divide()。需要注意的是數組必須具有相同的形狀或符合數組廣播規則。
廣播(Broadcast)是 numpy 對不同形狀(shape)的數組進行數值計算的方式, 對數組的算術運算通常在相應的元素上進行。
NumPy 統計函數
從數組中查找最小元素,最大元素,百分位標準差和方差等。
numpy.amin() 和 numpy.amax()
numpy.amin() 用於計算數組中的元素沿指定軸的最小值;numpy.amax() 用於計算數組中的元素沿指定軸的最大值。
import numpy as np
a=np.array([[1,2,3],[2,3,4],[8,7,5]])#二維數組包括行和列
print(a.ndim) #2維數組
print(a.shape) #(3, 3) 3行3列
print(np.amin(a,0))#沿軸0的最小值 [1 2 3]
print(np.amax(a,0))#沿軸0的最大值[8 7 5]
print(np.amin(a,1))#沿軸1的最小值 [1 2 5]
print(np.amax(a,1))#沿軸1的最大值[3 4 8]
#axis=0表示作用於列;axis=1表示作用於行
#print(np.amin(a,2)) 報錯numpy.AxisError: axis 2 is out of bounds for array of dimension 2
NumPy 排序函數
numpy.sort()
numpy.sort() 函數返回輸入數組的排序副本
numpy.argsort()
numpy.argsort() 函數返回的是數組值從小到大的索引值
numpy.argmax() 和 numpy.argmin()
分別沿給定軸返回最大和最小元素的索引
NumPy 矩陣庫(Matrix)
numpy.matlib.empty()
返回一個隨機矩陣
import numpy as np
import numpy.matlib
#numpy的__init__.py中並沒有引入matlib,
# matlib是一個新的包,只有這樣引入纔不會錯
m=np.matlib.empty((2,3))
print(m)
'''[[6.23042070e-307 1.89146896e-307 1.37961302e-306]
[6.23053614e-307 6.23053954e-307 1.33511969e-306]]'''
numpy.matlib.zeros()全零
m=np.matlib.zeros((2,3),dtype=int)
print(m)
'''[[0 0 0]
[0 0 0]]'''
numpy.matlib.ones()全1
numpy.matlib.eye()
對角線元素爲 1,其他位置爲零
numpy.matlib.identity()
給定大小的單位矩陣
NumPy 線性代數
讀寫數據
numpy.save()
import numpy as np
a=np.array([1,2,3])
np.save('a.npy',a)
#如果文件路徑末尾沒有擴展名 .npy,該擴展名會被自動加上
print(np.load('a.npy'))#[1 2 3]
numpy.savez()
import numpy as np
a=np.array([[1,2,3],[4,5,6]])#注意方括號的個數
b=np.arange(0,1.0,0.1)
c=np.sin(b)#c使用了關鍵字參數sin_array
np.savez('runoob.npz',a,b,sin_array=c)
r=np.load('runoob.npz')
#查看各數組的名稱
print(r['arr_0'])#數組a
'''[[1 2 3]
[4 5 6]]'''
print(r['arr_1'])#數組b
#[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
print(r['sin_array'])#數組c
'''[0. 0.09983342 0.19866933 0.29552021 0.38941834 0.47942554
0.56464247 0.64421769 0.71735609 0.78332691]'''
numpy.savetxt()與numpy.loadtxt()
NumPy Matplotlib
Matplotlib 是 Python 的繪圖庫。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。 它也可以和圖形工具包一起使用,如 PyQt 和 wxPython。