Numpy 包的基础使用
一、Numpy及其数据容器
Numpy(Numerical Python)是python数值计算中最重要的包,ndarray 数据容器可以存储n维数组是其核心特征之一。
二、生成ndarray数组
1.生成一个一维数组
import numpy as np
array = np.array([1, 2, 3, 4, 5])
print(array)
print(type(array))
[1 2 3 4 5]
<class 'numpy.ndarray'>
2.ndarray的一些基本属性
shape、reshape
import numpy as np
array1 = np.array([1, 2, 3, 4, 5])
array2 = np.array([[1, 2, 3, 4, 5]])
array3 = np.array([[1, 2, 3], [4, 5, 6]])
print(array1.shape)
print(array2.shape)
print(array3.shape)
(5,)
(1, 5)
(2, 3)
如何修改shape
可以直接修改shape或者用reshape修改
如果想增加维度可以用newaxis
如果想减少维度可以用squeeze
import numpy as np
array = np.arange(20)
print(array)
array.shape = 4, 5
print(array)
array = array.reshape(2, 10)
print(array)
array = array[np.newaxis, :]
print(array)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[[ 0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]]
[[[ 0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]]]
[[ 0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]]
dtype、astype
dtype是ndarray的数据类型
类型 | 解释 |
---|---|
int8、int16、int32、int64 | 有符号整数 |
uint8、uint16、uint32、unint64 | 无符号整数 |
float16、float32、float64、float | 浮点数 |
complex64、complex128、complex256 | 浮点复数 |
bool | 布尔值 |
object | python object类型 |
astype可以修改数组的dtype类型 |
import numpy as np
array = np.array([1, 2, 3, 4, 5])
print(array.dtype)
print(array)
array = array.astype(np.float16)
print(array.dtype)
print(array)
array = array.astype(np.bool_)
print(array.dtype)
print(array)
int32
[1 2 3 4 5]
float16
[1. 2. 3. 4. 5.]
bool
[ True True True True True]
size、itemsize、nbytes、ndim
import numpy as np
array = np.array([1, 2, 3, 4, 5])
print(f"数组元素的个数{array.size}")
print(f"数组每个元素所占位数{array.itemsize}")
print(f"数组所占位数{array.nbytes}")
print(f"数组的维度{array.ndim}")
数组元素的个数5
数组每个元素所占位数4
数组所占位数20
数组的维度1
3.生成特定数组
arange
类似于python中的range
import numpy as np
array1 = np.arange(0, 10, 2, dtype=np.int8)
[0 2 4 6 8]
linesapce和logspace
linesapce是线性空间生成数列
logspace是对数空间生成数列
import numpy as np
array2 = np.linspace(1, 10, 10, dtype=np.int8)
array3 = np.logspace(0, 10, 11, base=2, dtype=np.int16)
print(array2)
print(array3)
[ 1 2 3 4 5 6 7 8 9 10]
[ 1 2 4 8 16 32 64 128 256 512 1024]
zeros、ones、empty、fill、full
可以生成指定形状的全0、全1、空的数组
fill方法可以将空数组填充
full可以生成指定形状、指定数据填充的数组
import numpy as np
array4 = np.zeros(3, dtype=np.int16)
array5 = np.zeros((3, 3), dtype=np.int16)
array6 = np.ones((3, 3), dtype=np.int16)
array7 = np.empty((3,3), dtype=np.int16)
array7.fill(1)
array8 = np.full((3, 2), 1, dtype=np.int8)
print(array4)
print(array5)
print(array6)
print(array7.shape)
print(array8)
[0 0 0]
[[0 0 0]
[0 0 0]
[0 0 0]]
[[1 1 1]
[1 1 1]
[1 1 1]]
(3, 3)
[[1 1 1]
[1 1 1]
[1 1 1]]
[[1 1]
[1 1]
[1 1]]
zeros_like、ones_like、empty_like、full_like
zeros_like、ones_like、empty_like可以生成形似指定数组的全0、全1、空的数组
full_like可以生成形似指定数组的、指定数字填充的数组
import numpy as np
array9 = np.array([1, 2, 3, 4, 5])
print(np.zeros_like(array9))
print(np.ones_like(array9))
print(np.empty_like(array9).shape)
print(np.full_like(array9, 9))
[0 0 0 0 0]
[1 1 1 1 1]
(5,)
[9 9 9 9 9]
identity、eye
生成单位对角阵
import numpy as np
print(np.identity(3, dtype=np.int8))
print(np.eye(3, dtype=np.int8))
[[1 0 0]
[0 1 0]
[0 0 1]]
[[1 0 0]
[0 1 0]
[0 0 1]]
copy
拷贝操作
import numpy as np
array0 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
array1 = array0.copy()
print(array1)
[[1 2 3]
[4 5 6]
[7 8 9]]
索引
import numpy as np
array0 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(array0)
# 切片操作
print(array0[0, 0:2])
# 布尔类型做索引
grades = np.arange(0, 100, 10)
print(grades)
mask = np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1], dtype=bool)
print(mask)
print(grades[mask])
# where获得指定范围的索引
print(np.where(grades >= 60))
print(grades[np.where(grades >= 60)])
[[1 2 3]
[4 5 6]
[7 8 9]]
[1 2]
[ 0 10 20 30 40 50 60 70 80 90]
[False False False False False False True True True True]
[60 70 80 90]
(array([6, 7, 8, 9], dtype=int64),)
[60 70 80 90]
4.数组连接
concatenate
默认axis=0也就是竖着拼接
import numpy as np
a = np.array([[123, 456, 789],[3214, 456, 134]])
b = np.array([[12345, 3214, 432], [43, 13, 134]])
print(np.concatenate((a, b)))
print(np.concatenate((a,b), axis=1))
[[ 123 456 789]
[ 3214 456 134]
[12345 3214 432]
[ 43 13 134]]
[[ 123 456 789 12345 3214 432]
[ 3214 456 134 43 13 134]]
vstack、hstack
vstack竖着拼接
hstack横着拼接
效果和concatenate一样
flatten展平
import numpy as np
a = np.array([[123, 456, 789],[3214, 456, 134]])
b = np.array([[12345, 3214, 432], [43, 13, 134]])
c = np.concatenate((a, b))
print(c.flatten())
[ 123 456 789 3214 456 134 12345 3214 432 43 13 134]
5.随机模块
rand、randint、rand_sample
rand从均匀分布中抽取样本
randint可以指定形状,指定整数元素取值的数组
rand_sample可以生成[0, 1)的随机样本,服从标准高斯分布
import numpy as np
print(np.random.rand(2, 3))
print(np.random.randint(2, 5, size=(3, 4)))
print(np.random.random_sample())
[[0.01658336 0.34363667 0.48712169]
[0.14213359 0.35238332 0.76169609]]
[[4 4 2 3]
[3 2 2 4]
[3 3 2 4]]
0.7775361861439255
normal、shuffle
normal生成高斯分布
shuffle可以对数组洗牌乱序
import numpy as np
mu, sigma = 0, 0.1
print(np.random.normal(mu, sigma, 10))
array0 = np.arange(10)
print(array0)
np.random.shuffle(array0)
print(array0)
[ 0.0371535 -0.06437915 -0.11585887 0.10579892 -0.02946518
0.02704959 0.00949664 -0.0743719 0.00934385 0.05748404]
[0 1 2 3 4 5 6 7 8 9]
[5 6 3 2 1 9 4 7 0 8]
其他
binomial 二项分布抽取样本
beta 从β分布中抽取样本
chisquare 从卡方分布中抽取样本
gamma 从γ分布中抽取样本
uniform 从均匀分布[0, 1)中抽取样本
三、数组的算术
1.等尺寸数组基本运算
ndarray数组可以与数或与其等尺寸的数组进行加、减、乘、除、乘方的自由运算
运算规则是逐个元素进行运算
比较运算(==、>、<、>=、<=)会产生布尔值数组
也可以进行逻辑运算
import numpy as np
array0 = np.array([1, 2, 3, 4, 5])
array1 = array0 + 1
array2 = array0 + array0
array3 = array0 * array0
array4 = array0 > array0
print(array1)
print(array2)
print(array3)
print(array4)
x = np.array([1, 1, 2, 0, 1])
y = np.array([1, 1, 4, 1, 0])
print(np.logical_and(x, y))
print(np.logical_or(x, y))
print(np.logical_xor(x, y))
print(np.logical_not(x))
[2 3 4 5 6]
[ 2 4 6 8 10]
[ 1 4 9 16 25]
[False False False False False]
[ True True True False False]
[ True True True True True]
[False False False True True]
[False False False True False]
2.数组内部元素运算
求和、求积
可以数组内全部元素求和,也可以求列之和、行之和
sum方法求和与prod方法求积用法一样
import numpy as np
array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
all_sum = np.sum(array)
y_sum = np.sum(array, axis=0)
x_sum = np.sum(array, axis=1)
print(f"all_sum = {all_sum}")
print(f"y_sum = {y_sum}")
print(f"x_sum = {x_sum}")
all_sum = 45
y_sum = [12 15 18]
x_sum = [ 6 15 24]
求最大、最小及其索引
与sum方法使用类似
min、max用于求最小、最大元素
argmin、argmax用于求最小、最大元素对应索引
import numpy as np
array0 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.min(array0))
print(np.min(array0, axis=0))
print(np.min(array0, axis=1))
1
[1 2 3]
[1 4 7]
求均值、标准差、方差
与sum方法使用类似
mean求均值
std求标准差
var求方差
import numpy as np
array0 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.mean(array0))
print(np.mean(array0, axis=0))
print(np.mean(array0, axis=1))
5.0
[4. 5. 6.]
[2. 5. 8.]
其他逐元素操作
abs、sqrt、square、exp
log、log10、log2、log1p
sign、ceil、floor
rint保留整数位,维持dtype
modf小数部分、和整数部分分开返回
各类三角函数
截断、四舍五入
import numpy as np
array0 = np.array([[1.2, 3.56, 7.89], [1.89, 3.12, 7.56]])
print(array0)
print(np.clip(array0, 2, 4))
print(np.round(array0, decimals=1))
[[1.2 3.56 7.89]
[1.89 3.12 7.56]]
[[2. 3.56 4. ]
[2. 3.12 4. ]]
[[1.2 3.6 7.9]
[1.9 3.1 7.6]]
排序
sort方法与sum使用方法类似,并且默认降序
searchsorted是找到应该插入位置的索引
import numpy as np
array0 = np.array([[1.5, 1.3, 7.5],[5.6, 7.8, 1.2]])
print(array0)
print(np.sort(array0))
print(np.sort(array0, axis=0))
array1 = np.linspace(0, 10, 10)
values = np.array1([2.5, 6.5, 9.5])
print(np.searchsorted(array1, values))
[[1.2 3.56 7.89]
[1.89 3.12 7.56]]
[[2. 3.56 4. ]
[2. 3.12 4. ]]
[[1.2 3.6 7.9]
[1.9 3.1 7.6]]
四、线性代数中应用
1.向量的内积
import numpy as np
x = np.array([2, 2])
y = np.array([5, 5])
print(np.dot(x, y))
20
2.矩阵点乘
import numpy as np
x = np.array([2, 2])
y = np.array([5, 5])
x = x.reshape(2, 1)
y = y.reshape(1, 2)
print(np.dot(x, y))
[[10 10]
[10 10]]
3.其他常用
diag 对角线元素返回一维数组,或将一维数组转换成对角阵
trace 求迹,对角元素之和
det 求行列式
eig 求特征值和特征向量
inv 求逆
pinv 求Moore-Penrose伪逆
qr 计算QR分解
svd 计算奇异值分解(SVD)
solve 求解Ax = b
lstsq 求Ax = b 的最小二乘解