1. 簡介
NumPy(Numerical Python)是一個開源的 Python 科學(xué)計算擴展庫,,主要用來處理任意維度數(shù)組與矩陣,通常對于相同的計算任務(wù),,使用 NumPy 要比直接使用 Python 基本數(shù)據(jù)結(jié)構(gòu)要簡單,、高效的多。安裝使用 pip install numpy 命令即可,。
2. 使用
2.1 ndarray
ndarray 即 n 維數(shù)數(shù)組類型,,它是一個相同數(shù)據(jù)類型的集合,,以 0 下標(biāo)為開始進(jìn)行集合中元素的索引,。
創(chuàng)建數(shù)組可以使用 NumPy 的 array 方法,具體格式如下:
array(p_object, dtype=None, copy=True, order=‘K’, subok=False, ndmin=0)
-
p_object:數(shù)組或嵌套的數(shù)列
-
dtype:數(shù)組元素的數(shù)據(jù)類型
-
copy:是否需要復(fù)制
-
order:創(chuàng)建數(shù)組的樣式,,C 為行方向,,F(xiàn) 為列方向,A 為任意方向(默認(rèn))
-
subok:默認(rèn)返回一個與基類類型一致的數(shù)組
-
ndmin:生成數(shù)組的最小維度
當(dāng)然,,還可以使用 arange 方法,,下面看一下具體使用示例。
創(chuàng)建數(shù)組
看一下如何創(chuàng)建一維數(shù)組
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array(range(1, 6))
arr3 = np.arange(1, 6)
print (arr1)
print (arr2)
print (arr3)
看一下如何創(chuàng)建多維數(shù)組,以二維數(shù)組為例
import numpy as np
arr = np.array([[1, 2], [3, 4], [5, 6]])
print(arr)
常用屬性
通過示例來看一下 ndarray 對象的常用屬性
import numpy as np
arr = np.array([1, 2, 3])
# 元素類型
print(arr.dtype)
# 形狀
print(arr.shape)
# 元素個數(shù)
print(arr.size)
# 維度
print(arr.ndim)
# 每個元素大?。ㄗ止?jié))
print(arr.itemsize)
改變數(shù)組的形狀
import numpy as np
arr = np.arange(30)
print(arr)
# 變成二維數(shù)組
arr.shape = (5, 6)
print(arr)
# 變成三維數(shù)組
arr = arr.reshape((2, 3, 5))
print(arr)
2.2 數(shù)據(jù)類型
通過下表來看一下 NumPy 的常用數(shù)據(jù)類型,。
類型 |
描述 |
int_ |
默認(rèn)的整數(shù)類型(類似于 C 語言中的 long,int32 或 int64) |
intc |
與 C 的 int 類型一樣,,一般是 int32 或 int 64 |
intp |
用于索引的整數(shù)類型(類似于 C 的 ssize_t,,一般情況下仍然是 int32 或 int64) |
int8 |
字節(jié)(-128 to 127) |
int16 |
整數(shù)(-32768 to 32767) |
int32 |
整數(shù)(-2147483648 to 2147483647) |
int64 |
整數(shù)(-9223372036854775808 to 9223372036854775807) |
uint8 |
無符號整數(shù)(0 to 255) |
uint16 |
無符號整數(shù)(0 to 65535) |
uint32 |
無符號整數(shù)(0 to 4294967295) |
uint64 |
無符號整數(shù)(0 to 18446744073709551615) |
bool_ |
布爾型數(shù)據(jù)類型(True 或者 False) |
float_ |
float64 類型的簡寫 |
float16 |
半精度浮點數(shù),包括:1 個符號位,,5 個指數(shù)位,,10 個尾數(shù)位 |
float32 |
單精度浮點數(shù),,包括:1 個符號位,,8 個指數(shù)位,23 個尾數(shù)位 |
float64 |
雙精度浮點數(shù),,包括:1 個符號位,,11 個指數(shù)位,,52 個尾數(shù)位 |
complex_ |
complex128 類型的簡寫,即 128 位復(fù)數(shù) |
complex64 |
復(fù)數(shù),,表示雙 32 位浮點數(shù)(實數(shù)部分和虛數(shù)部分) |
complex128 |
復(fù)數(shù),,表示雙 64 位浮點數(shù)(實數(shù)部分和虛數(shù)部分) |
通過示例來看一下如何修改數(shù)據(jù)類型。
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([1.111, 2.222, 3.333])
# 當(dāng)前數(shù)據(jù)類型
print(arr1.dtype)
# 修改數(shù)據(jù)類型
arr1 = arr1.astype(np.int64)
print(arr1.dtype)
# 保留一位小數(shù)
arr2 = np.round(arr2, 1)
print(arr2)
2.3 索引與切片
NumPy 數(shù)組支持索引,、切片操作,,還可以進(jìn)行迭代,先看一下一維數(shù)組,。
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
print(arr[3])
# 修改元素值
arr[3] = 10
print(arr[3])
print(arr[2:])
print(arr[2:4])
print(arr[4:])
for i in arr:
print(i)
再看一下多維數(shù)組的這些操作,。
import numpy as np
arr = np.arange(12).reshape(3, 4)
print(arr)
# 取某一個值
print(arr[2, 3])
# 取多個不連續(xù)的值
print(arr[[0, 2],[1, 3]])
# 取一行
print(arr[0])
# 連續(xù)取多行
print(arr[1:])
# 取不連續(xù)的多行
print(arr[[0, 2]])
# 取一列
print(arr[:, 0])
# 連續(xù)取多列
print(arr[:, 2:])
# 取不連續(xù)的多列
print(arr[:, [0, 2]])
2.4 副本與視圖
視圖(淺復(fù)制)只是原有數(shù)據(jù)的一個引用,通過該引用可訪問,、操作原有數(shù)據(jù),,如果我們對視圖進(jìn)行修改,它會影響原始數(shù)據(jù),,因為淺復(fù)制共享內(nèi)存,。
副本(深復(fù)制)是對數(shù)據(jù)的完整拷貝,如果我們對副本進(jìn)行修改,,它不會影響到原始數(shù)據(jù),,因為深復(fù)制不共享內(nèi)存。
調(diào)用 ndarray 的 view() 方法會產(chǎn)生一個視圖,,下面通過示例來看一下,。
import numpy as np
a = np.arange(6).reshape(2,3)
# 創(chuàng)建視圖
b = a.view()
print('a的id:', id(a))
print('b的id:', id(b))
# 修改 b 的形狀
b.shape = 3,2
print('a的形狀:')
print(a)
print('b的形狀:')
print(b)
print(a is b)
調(diào)用 ndarray 的 copy() 方法會產(chǎn)生一個副本,下面通過示例來看一下,。
import numpy as np
a = np.arange(1, 6)
# 創(chuàng)建副本
b = a.copy()
print(a is b)
b[1] = 10
print(a[1])
print(b[1])
2.5 軸的概念
NumPy 中的軸簡單來說就是方向的意思,,使用數(shù)字 0,、1、2 表示,,一維數(shù)組只有 0 軸,,二維數(shù)組有 0、1 軸,,三維數(shù)組有 0,、1、2 軸,,了解軸的相應(yīng)概念可以方便我們進(jìn)行相應(yīng)計算,。
2.6 基本運算
數(shù)組與數(shù)字之間運算
看一下數(shù)組與數(shù)字之間的加、減,、乘,、除運算。
import numpy as np
arr = np.arange(12).reshape(3, 4)
print(arr + 3)
print(arr - 1)
print(arr * 2)
print(arr / 3)
數(shù)組與數(shù)組之間運算
看一下數(shù)組與數(shù)組之間的運算,。
import numpy as np
# 相同行數(shù),,相同列數(shù)
a = np.arange(12).reshape(3, 4)
b = np.arange(20, 32).reshape(3, 4)
print(a + b)
print(b * a)
# 相同行數(shù)
c = np.arange(12).reshape(3, 4)
d = np.arange(3).reshape(3, 1)
print(c + d)
print(c - d)
# 相同列數(shù)
e = np.arange(12).reshape(4, 3)
f = np.arange(3).reshape(1, 3)
print(e * f)
print(e - f)
常用數(shù)學(xué)運算
import numpy as np
arr = np.array([[33, 55], [11, 66], [22, 99]])
print(arr)
# 最大值
print(np.max(arr))
# 最小值
print(np.min(arr))
# 某一軸上的最大值
print(np.max(arr, 1))
# 某一軸上的最小值
print(np.min(arr, 1))
# 平均值
print(np.mean(arr))
# 某一行、一列的平均值
print(np.mean(arr, axis=1))
# 最大值索引
print(np.argmax(arr))
print(np.argmax(arr, axis=1))
# 最小值索引
print(np.argmin(arr))
print(np.argmin(arr, axis=1))
# 極差
print(np.ptp(arr))
print(np.ptp(arr, axis=1))
# 方差
print(np.var(arr))
# 標(biāo)準(zhǔn)差
print(np.std(arr))
# 中位數(shù)
print(np.median(arr))
2.7 常用操作
添加操作
NumPy 的 append() 方法可以在數(shù)組的末尾添加值,,該操作會分配至整個數(shù)組,,并把原數(shù)組復(fù)制到新數(shù)組,該操作需保證輸入的維度匹配,,下面看一下使用示例,。
import numpy as np
arr = np.array([[1, 3, 5], [2, 4, 6]])
# 添加元素
print(np.append(arr, [1, 1, 3]))
# 沿 0 軸添加元素
print(np.append(arr, [[1, 1, 3]], axis=0))
# 沿 1 軸添加元素
print(np.append(arr, [[1, 1, 3], [2, 1, 5]], axis=1))
我們還可以使用 insert() 方法進(jìn)行添加操作,該方法在給定索引前沿給定軸向數(shù)組中插入值,,下面看一下使用示例,。
import numpy as np
arr = np.array([[1, 3, 5], [2, 4, 6]])
# 添加元素
print(np.insert(arr, 1, [1, 1, 3]))
# 沿 0 軸添加元素
print(np.insert(arr, 1, [1, 1, 3], axis=0))
# 沿 1 軸添加元素
print(np.insert(arr, 1, [1, 5], axis=1))
刪除操作
NumPy 的 delete() 可以對數(shù)組進(jìn)行刪除操作,下面看一下使用示例,。
import numpy as np
arr = np.array([[1, 3, 5], [2, 4, 6]])
# 刪除元素
print(np.delete(arr, 1))
# 沿 0 軸刪除元素
print(np.delete(arr, 1, axis=0))
# 沿 1 軸刪除元素
print(np.delete(arr, 1, axis=1))
去重操作
NumPy 的 unique() 方法可以去除數(shù)組中的重復(fù)元素,。
import numpy as np
arr = np.array([1, 3, 5, 2, 4, 6, 1, 5, 3])
# 去除重復(fù)元素
print(np.unique(arr))
# 去重數(shù)組的索引數(shù)組
u, indices = np.unique(arr, return_index=True)
print(indices)
# 去重元素的重復(fù)數(shù)量
u, indices = np.unique(arr, return_counts=True)
print(indices)
|