三维数组地址计算_科学计算NumPy
incipe
讀完需要
20分鐘速讀僅需 7 分鐘
什么是 Numpy
?NumPy 是一個運行速度非常快的數學庫,主要用于數組計算,包含:
- 一個強大的 N 維數組對象 ndarray
- 廣播功能函數
- 整合 C/C++/Fortran 代碼的工具
- 線性代數、傅里葉變換、隨機數生成等功能
使用
Ⅰ. 創建 ndarray
調用 array() 方法即可。
def?array(object,?dtype=None,?copy=True,?order='K',?subok=False,?ndmin=0)參數:
- object 數組或嵌套的數列。
- dtype 數組元素的數據類型。
- copy 對象是否需要復制。
- order 創建數組的樣式,,C 為行方向,F 為列方向,A 原順序,K 元素在內存中的出現順序。
- subok 默認返回一個與基類類型一致的數組。
- ndmin 指定生成數組的最小維度。
還可以使用:
numpy.arange(12)?#?創建一個一維數組。`#?array([?0,??1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11])`
numpy.arange(12).reshape(3,?4)??#?創建一個3行4列的數組。
"""
array([[?0,??1,??2,??3],
???????[?4,??5,??6,??7],
???????[?8,??9,?10,?11]])
"""
numpy.arange(12).reshape(2,?2,?3)?#?創建一個三維數組
"""
array([[[?0,??1,??2],
????????[?3,??4,??5]],
???????[[?6,??7,??8],
????????[?9,?10,?11]]])
"""
怎么理解三維數組,簡單的來說,我們把第一維看成數組分成了多少塊,第二維就是每塊有機房,第三維就是有幾列。
Ⅱ. 查看數據類型
調用方法 dtype 即可。
t1?=?np.arange(18).reshape(3,?3,?2)t1.detype
"""
dtype('int64')
"""
更多數據類型請參考 numpy 中文網[1]
Ⅲ. 查看數組維度
調用 shape 方法即可。
import?numpy?as?npt1?=?np.array([[1,?2,?3],?[4,?5,?6]])
t1.shape
#?(2,?3)
shape 方法給我們返回一個元組。
調用 reshape() 方法改變數組形狀。
t2?=?t1.reshape(3,?2)"""
array([[1,?2],
???????[3,?4],
???????[5,?6]])
"""
調用 reshape() 方法后,原來的數組形狀是不變的,返回值返回變形后的新數組。
把數組轉化為一維數組。
t3?=?t2.flatten()"""
array([1,?2,?3,?4,?5,?6])
"""
還可以用
t4?=?t2.reshape(6,)"""
array([1,?2,?3,?4,?5,?6])
"""
或者
t5?=?t2.reshape(t2.shape[0]?*?t2.shape[1],?)"""
array([1,?2,?3,?4,?5,?6])
"""
因為 shape 方法返回一個 tuple 所以第一個是行,第二個是列,行 × 列就是數組總個數。
轉換成二維,三維方法一樣 t.reshape(2, 3) 把數組 t 轉化為 2 行 3 列的數組。
Ⅳ. 數組的計算
數組與數字
數字和數組里面的每個數字相加、相減、相乘、相除。
t?=?np.array([[[1,?2,?3],?[4,?5,?6],?[7,?8,?9]]])t?+=?2
"""
array([[[?3,??4,??5],
????????[?6,??7,??8],
????????[?9,?10,?11]]])
"""
注意,這里除 0,只會有警告,不會報錯。
t?=?np.array([0,?1,?2])t?/=?0
#?array([nan,?inf,?inf])
這里的 nan 是由 0 除 0 產生的,即 not a number 不是一個數字
這里的 inf 是由其它數字除 0 產生的,即 無窮的意思。
數組與數組
t2?=?np.arange(100,?112).reshape(3,?4)
t1?+?t2
"""
array([[100,?102,?104,?106],
???????[108,?110,?112,?114],
???????[116,?118,?120,?122]])
"""
數組形狀不一樣時,如果兩個數組的后緣維度(從后面開始算起的維度)的軸長度相符或其中一方長度為 1 時,是廣播相容的。
比如,(3, 4)和 (4,)是可以計算的;(2, 3, 4)和(1, 3, 4)是可以計算的。
"""
array([[?0,??1,??2,??3],
???????[?4,??5,??6,??7],
???????[?8,??9,?10,?11]])
"""
t3?=?np.arange(4)
#?array([0,?1,?2,?3])
t1?+?t3
"""
array([[?0,??2,??4,??6],
???????[?4,??6,??8,?10],
???????[?8,?10,?12,?14]])
"""
或者
t1?=?np.arange(12).reshape(3,?4)"""
array([[?0,??1,??2,??3],
???????[?4,??5,??6,??7],
???????[?8,??9,?10,?11]])
"""
t4?=?np.arange(3).reshape(3,?1)
"""
array([[0],
???????[1],
???????[2]])
"""
t1?+?t4
"""
array([[?0,??1,??2,??3],
???????[?5,??6,??7,??8],
???????[10,?11,?12,?13]])
"""
Ⅴ. 讀取數據
這個功能用的不多,因為 pandas 太強了。
import?numpy?as?npnp.loadtxt(frame,?dtype=float,?comments='#',?delimiter=None,?converters=None,?skiprows=0,?usecols=None,?unpack=False,?ndmin=0,?encoding='bytes',?max_rows=None)
參數:
- frame 文件,字符串或者產生器,一般是文件的絕對路徑或者相對路徑。
- dtype 數據類型、文件的字符串以什么數據類型讀入數組中。
- comments 跳過文件中指定參數開頭的行。
- delimiter 讀取文件中數據的分隔符。
- converters 對讀取的數據進行預處理。
- skiprows 選擇跳過的行數,一般跳過第一行表頭。
- uescols 指定需要讀取的列。
- unpack 如果為 True,讀入屬性將分別寫入不同數組變量,False 讀入數據只寫入一個數組變量。就是轉置的意思。
- encoding 對讀取文件進行預編碼。
- max_rows 最大讀取行數。
Ⅵ. 數組的轉置
一維數組不需要轉置。
二維數組轉置
import?numpy?as?npt1?=?np.arange(24).reshape(4,?6)
t2?=?t1.T
"""
array([[?0,??6,?12,?18],
???????[?1,??7,?13,?19],
???????[?2,??8,?14,?20],
???????[?3,??9,?15,?21],
???????[?4,?10,?16,?22],
???????[?5,?11,?17,?23]])
"""
t3?=?t1.transpose()
"""
array([[?0,??6,?12,?18],
???????[?1,??7,?13,?19],
???????[?2,??8,?14,?20],
???????[?3,??9,?15,?21],
???????[?4,?10,?16,?22],
???????[?5,?11,?17,?23]])
"""
三維及三維以上。
t4?=?np.arange(16).reshape(2,?2,?4)t4.transpose((1,?0,?2))
"""
array([[[?0,??1,??2,??3],
????????[?8,??9,?10,?11]],
???????[[?4,??5,??6,??7],
????????[12,?13,?14,?15]]])
"""
t4.swapaxes(1,?0)
"""
array([[[?0,??1,??2,??3],
????????[?8,??9,?10,?11]],
???????[[?4,??5,??6,??7],
????????[12,?13,?14,?15]]])
"""
transpose() 接受一個元組,原來的軸是 (0, 1, 2) 通過 transpose() 方法把原來的 0 軸變成了 1 軸。
三維的數組的軸,就看成一個 xyz 坐標系即可。x 軸對應于 0 軸,y 軸對應于 1 軸,z 軸對應于 2 軸。
Ⅶ. numpy 索引和切片
取行
import?numpy?as?npt?=?np.arange(24).reshape(4,?6)
"""
array([[?0,??1,??2,??3,??4,??5],
???????[?6,??7,??8,??9,?10,?11],
???????[12,?13,?14,?15,?16,?17],
???????[18,?19,?20,?21,?22,?23]])
"""
t[1]?#?t[1,?:]
"""
array([0,?1,?2,?3,?4,?5])
"""
t[1::]?#?t[1::,?:]
"""
array([[?6,??7,??8,??9,?10,?11],
???????[12,?13,?14,?15,?16,?17],
???????[18,?19,?20,?21,?22,?23]])
"""
t[[1,?3]]?#?t[[1,?3],?:]
"""
array([[?6,??7,??8,??9,?10,?11],
???????[18,?19,?20,?21,?22,?23]])
"""
取列
t[:,2]"""
array([?2,??8,?14,?20])
"""
#?取列[:,2]前面的:不能省略,?表示所有行都要
t[:,?2::]
"""
array([[?2,??3,??4,??5],
???????[?8,??9,?10,?11],
???????[14,?15,?16,?17],
???????[20,?21,?22,?23]])
"""
t[:,?[1,?2,?3]]
"""
array([[?1,??2,??3],
???????[?7,??8,??9],
???????[13,?14,?15],
???????[19,?20,?21]])
"""
同時取行和列
t[2,3]#?15?表示取3行4列的元素
t[1:3,2:5]
"""
array([[?8,??9,?10],
???????[14,?15,?16]])
"""
t[[0,?1,?2],?[2,?3,?4]]
"""
array([?2,??9,?16])
"""
Ⅷ. 修改數組值
t?10"""
array([[?True,??True,??True,??True,??True,??True],
???????[?True,??True,??True,??True,?False,?False],
???????[False,?False,?False,?False,?False,?False],
???????[False,?False,?False,?False,?False,?False]])
"""
t[t?10]?=?100
"""
array([[100,?100,?100,?100,?100,?100],
???????[100,?100,?100,?100,??10,??11],
???????[?12,??13,??14,??15,??16,??17],
???????[?18,??19,??20,??21,??22,??23]])
"""
t?=?np.arange(24).reshape(4,6)
"""
array([[?0,??1,??2,??3,??4,??5],
???????[?6,??7,??8,??9,?10,?11],
???????[12,?13,?14,?15,?16,?17],
???????[18,?19,?20,?21,?22,?23]])
"""
np.where(t?10,?0,?100)
"""
array([[??0,???0,???0,???0,???0,???0],
???????[??0,???0,???0,???0,?100,?100],
???????[100,?100,?100,?100,?100,?100],
???????[100,?100,?100,?100,?100,?100]])
"""
t?=?np.arange(24).reshape(4,6)
t.clip(10,?18)
"""
array([[10,?10,?10,?10,?10,?10],
???????[10,?10,?10,?10,?10,?11],
???????[12,?13,?14,?15,?16,?17],
???????[18,?18,?18,?18,?18,?18]])
小于10的替換成10,大于18的替換為18,不能替換nan
"""
t?=?t.astype(float)
"""
array([[?0.,??1.,??2.,??3.,??4.,??5.],
???????[?6.,??7.,??8.,??9.,?10.,?11.],
???????[12.,?13.,?14.,?15.,?16.,?17.],
???????[18.,?19.,?20.,?21.,?22.,?23.]])
"""
t[3,?3]?=?np.nan
"""
array([[?0.,??1.,??2.,??3.,??4.,??5.],
???????[?6.,??7.,??8.,??9.,?10.,?11.],
???????[12.,?13.,?14.,?15.,?16.,?17.],
???????[18.,?19.,?20.,?nan,?22.,?23.]])
"""
t.clip(10,?18)
"""
array([[10.,?10.,?10.,?10.,?10.,?10.],
???????[10.,?10.,?10.,?10.,?10.,?11.],
???????[12.,?13.,?14.,?15.,?16.,?17.],
???????[18.,?18.,?18.,?nan,?18.,?18.]])
"""
Ⅸ. nan 特性
兩個 nan 是不相等的。
np.nan?==?np.nan#?False
根據這個特性,判斷一個數組中有多少個 nan
t"""
array([[?0.,??1.,??2.,??3.,??4.,??5.],
???????[?6.,??7.,??8.,??9.,?10.,?11.],
???????[12.,?13.,?14.,?15.,?16.,?17.],
???????[18.,?19.,?20.,?nan,?22.,?23.]])
"""
np.count_nonzero(t!=t)
#?1
判斷一個數字是不是 nan
np.isnan(t[3,?3])#?True
np.isnan(t)
"""
array([[False,?False,?False,?False,?False,?False],
???????[False,?False,?False,?False,?False,?False],
???????[False,?False,?False,?False,?False,?False],
???????[False,?False,?False,??True,?False,?False]])
"""
t[np.isnan(t)]?=?0
"""
array([[?0.,??1.,??2.,??3.,??4.,??5.],
???????[?6.,??7.,??8.,??9.,?10.,?11.],
???????[12.,?13.,?14.,?15.,?16.,?17.],
???????[18.,?19.,?20.,??0.,?22.,?23.]])
"""
nan 與任何值計算都為 nan
t"""
array([[?0.,??1.,??2.,??3.,??4.,??5.],
???????[?6.,??7.,??8.,??9.,?10.,?11.],
???????[12.,?13.,?14.,?15.,?16.,?17.],
???????[18.,?19.,?20.,?nan,?22.,?23.]])
"""
t.sum()?#?np.sum(t)
#?nan
np.sum(t,?axis=0)
"""
array([36.,?40.,?44.,?nan,?52.,?56.])
"""
求和 np.sum() 方法里的參數 axis 表示軸的意思,一維數組一個軸,就是 0 二維數組兩個軸 0, 1 三維數組三個軸 0, 1, 2
Ⅹ. numpy 中常用的統計函數
- 求和 np.sum(a, axis=None)
- 均值 np.mean(a, axis=None)
- 中值 np.median(a, axis=None)
- 最大值 np.max(a, axis=None)
- 最小值 np.min(a, axis=None)
- 極差 np.ptp(a, axis=None)
- 標準差 np.sed(a, axis=None)
標準差公式
這里都只列舉的兩個參數,更多參數作用可以參考源代碼。
Ⅺ. 數組的拼接
豎直拼接
t1?=?np.arange(24).reshape(4,?6)"""
array([[?0,??1,??2,??3,??4,??5],
???????[?6,??7,??8,??9,?10,?11],
???????[12,?13,?14,?15,?16,?17],
???????[18,?19,?20,?21,?22,?23]])
"""
t2?=?np.arange(24,?48).reshape(4,?6)
"""
array([[24,?25,?26,?27,?28,?29],
???????[30,?31,?32,?33,?34,?35],
???????[36,?37,?38,?39,?40,?41],
???????[42,?43,?44,?45,?46,?47]])
"""
np.vstack((t1,?t2))
"""
array([[?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]])
"""
水平拼接
np.hstack((t1,?t2))"""
array([[?0,??1,??2,??3,??4,??5,?24,?25,?26,?27,?28,?29],
???????[?6,??7,??8,??9,?10,?11,?30,?31,?32,?33,?34,?35],
???????[12,?13,?14,?15,?16,?17,?36,?37,?38,?39,?40,?41],
???????[18,?19,?20,?21,?22,?23,?42,?43,?44,?45,?46,?47]])
"""
XII. 其他方法
- 獲取最大最小值位置,np.argmax(a, axis=None) np.argmin(a, axis=None)
- 創建一個全為 0 的數組,np.zeros((行, 列))
- 創建一個全為 1 的數組,np.ones((行, 列))
- 創建一個對角線為 1 的正方形數組(方陣),np.eys(3)
生成隨機數
- np.random.rand(d0, d1, d2, ... , dn) n 維度均勻分布隨機數組,范圍 0 ~ 1
- np.random.randn(d0, d1, d2, ... , dn) n 維度正態分布隨機數組,平均數 0,標準差 1
- np.random.randint(low, high, (行, 列)) 范圍 [low, high)
- np.random.uniform(low, high, (行, 列) 浮點數
- np.random.normal(loc, scale, (行, 列)) 指定正態分布抽取樣本,分布中心 loc ,標準差 scale
- np.random.seed() 隨機種子,c/c++常用操作 srand((unisgned)time(NULL))
Reference
[1]numpy 中文網: https://www.numpy.org.cn/user/basics/types.html#數組類型之間的轉換
- END -總結
以上是生活随笔為你收集整理的三维数组地址计算_科学计算NumPy的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python简单代码运行_python代
- 下一篇: 铸铁锅炖酸菜汤泡饭后米饭变色?