Numpy —— (1)基礎數據結構

一、簡介

Python中的list列表也可以非常靈活的處理多個元素的操作,但效率卻非常低。與之比較,ndarray數組具有如下特點:

  • ndarray數組中所有元素的數據類型相同、數據地址連續,批量操作數組元素時速度更快。而list列表中元素的數據類型可能不同,需要通過尋址方式找到下一個元素。
  • ndarray數組支持廣播機制,矩陣運算時不需要寫for循環。
  • Numpy底層使用c語言編寫,內置並行計算功能,運行速度高於Python代碼。

二、創建ndarray數組

創建ndarray數組最簡單的方式就是使用array函數,它接受一切序列型的對象(包括其他數組),然後產生一個新的含有傳入數據的numpy數組。

array:創建將嵌套序列(比如由一組等長列表組成的列表),並轉換爲一個多維數組。

# 導入numpy
import numpy as np

# 從list創建array 
a = [1,2,3,4,5,6]  # 創建簡單的列表
b = np.array(a)    # 將列表轉換爲數組
b
array([1, 2, 3, 4, 5, 6])

arange:創建元素從0到200依次遞增2的數組。

# 通過np.arange創建
# 通過指定start, stop (不包括stop),interval來產生一個1維的ndarray
a = np.arange(0, 20, 2)
a
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])

zeros:創建指定長度或者形狀的全0數組。

# 創建全0的ndarray
a = np.zeros([3,3])
a
array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])

ones:創建指定長度或者形狀的全1數組。

# 創建全1的ndarray
a = np.ones([3,3])
a
array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])

三、查看ndarray數組的屬性

ndarray的屬性包括shape、dtype、size和ndim等,通過如下代碼可以查看darray數組的屬性。

  • shape:數組的形狀 ndarray.shape,1維數組(N, ),二維數組(M, N),三維數組(M, N, K)。
  • dtype:數組的數據類型。
  • size:數組中包含的元素個數 ndarray.size,其大小等於各個維度的長度的乘積。
  • ndim:數組的維度大小,ndarray.ndim, 其大小等於ndarray.shape所包含元素的個數。
a = np.ones([3, 3])
print('a, dtype: {}, shape: {}, size: {}, ndim: {}'.format(a.dtype, a.shape, a.size, a.ndim))
a, dtype: float64, shape: (3, 3), size: 9, ndim: 2

四、改變ndarray數組的數據類型和形狀

# 轉化數據類型
b = a.astype(np.int64)
print('b, dtype: {}, shape: {}'.format(b.dtype, b.shape))

# 改變形狀
c = a.reshape([1, 9])
print('c, dtype: {}, shape: {}'.format(c.dtype, c.shape))
b, dtype: int64, shape: (3, 3)
c, dtype: float64, shape: (1, 9)

五、ndarray數組的基本運算

ndarray數組可以像普通的數值型變量一樣進行加減乘除操作,主要包含如下兩種運算:

  • 標量和ndarray數組之間的運算
  • 兩個ndarray數組之間的運算

5.1 標量和ndarray數組之間的運算

標量和ndarray數組之間的運算主要包括除法、乘法、加法和減法運算,具體代碼如下所示。

# 標量除以數組,用標量除以數組的每一個元素
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
1. / arr
array([[1. , 0.5 , 0.33333333], [0.25 , 0.2 , 0.16666667]])
# 標量乘以數組,用標量乘以數組的每一個元素
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
2.0 * arr
array([[ 2., 4., 6.], [ 8., 10., 12.]])
# 標量加上數組,用標量加上數組的每一個元素
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
2.0 + arr
array([[3., 4., 5.], [6., 7., 8.]])
# 標量減去數組,用標量減去數組的每一個元素
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
2.0 - arr
array([[ 1., 0., -1.], [-2., -3., -4.]])

5.2 兩個ndarray數組之間的運算

兩個ndarray數組之間的運算主要包括減法、加法、乘法、除法和開根號運算,具體代碼如下所示。

# 數組 減去 數組, 用對應位置的元素相減
arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
arr2 = np.array([[11., 12., 13.], [21., 22., 23.]])
arr1 - arr2
array([[-10., -10., -10.], [-17., -17., -17.]])
# 數組 加上 數組, 用對應位置的元素相加
arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
arr2 = np.array([[11., 12., 13.], [21., 22., 23.]])
arr1 + arr2
array([[12., 14., 16.], [25., 27., 29.]])
# 數組 乘以 數組,用對應位置的元素相乘
arr1 * arr2
array([[ 11., 24., 39.], [ 84., 110., 138.]])
# 數組 除以 數組,用對應位置的元素相除
arr1 / arr2
array([[0.09090909, 0.16666667, 0.23076923], [0.19047619, 0.22727273, 0.26086957]])
# 數組開根號,將每個位置的元素都開根號
arr ** 0.5
array([[1. , 1.41421356, 1.73205081], [2. , 2.23606798, 2.44948974]])

六、ndarray數組的統計方法

可以通過數組上的一組數學函數對整個數組或某個軸向的數據進行統計計算。主要包括如下統計方法:

  • mean:計算算術平均數,零長度數組的mean爲NaN。
  • std和var:計算標準差和方差,自由度可調(默認爲n)。
  • sum :對數組中全部或某軸向的元素求和,零長度數組的sum爲0。
  • max和min:計算最大值和最小值。
  • argmin和argmax:分別爲最大和最小元素的索引。
  • cumsum:計算所有元素的累加。
  • cumprod:計算所有元素的累積。

說明:

sum、mean以及標準差std等聚合計算既可以當做數組的實例方法調用,也可以當做Numpy函數使用。

# 計算均值,使用arr.mean() 或 np.mean(arr),二者是等價的
arr = np.array([[1,2,3], [4,5,6], [7,8,9]])
arr.mean(), np.mean(arr)
(5.0, 5.0)
# 求和
arr.sum(), np.sum(arr)
(45, 45)
# 求最大值
arr.max(), np.max(arr)
(9, 9)
# 求最小值
arr.min(), np.min(arr)
(1, 1)
# 指定計算的維度
# 沿着第1維求平均,也就是將[1, 2, 3]取平均等於2,[4, 5, 6]取平均等於5,[7, 8, 9]取平均等於8
arr.mean(axis = 1)
array([2., 5., 8.])
# 沿着第0維求和,也就是將[1, 4, 7]求和等於12,[2, 5, 8]求和等於15,[3, 6, 9]求和等於18
arr.sum(axis=0)
array([12, 15, 18])

越裏面的中括號對應的維度值越高

# 沿着第0維求最大值,也就是將[1, 4, 7]求最大值等於7,[2, 5, 8]求最大值等於8,[3, 6, 9]求最大值等於9
arr.max(axis=0)
array([7, 8, 9])
# 沿着第1維求最小值,也就是將[1, 2, 3]求最小值等於1,[4, 5, 6]求最小值等於4,[7, 8, 9]求最小值等於7
arr.min(axis=1)
array([1, 4, 7])
# 計算標準差
arr.std()
2.581988897471611
# 計算方差
arr.var()
6.666666666666667
# 找出最大元素的索引
arr.argmax(), arr.argmax(axis=0), arr.argmax(axis=1)
(8, array([2, 2, 2]), array([2, 2, 2]))
# 找出最小元素的索引
arr.argmin(), arr.argmin(axis=0), arr.argmin(axis=1)
(0, array([0, 0, 0]), array([0, 0, 0]))

打賞

如果對您有幫助,就打賞一下吧O(∩_∩)O

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章