NumPy的使用
简介
1.概述
NumPy是一个Python库,用于数值计算和处理数组。它是其他数据分析和机器学习库的底层库,提供了高效的多维数组运算功能。NumPy完全使用标准C语言实现,以提高运行效率。它是一款开源免费的库。并于1995年由Numeric项目发展而来。在2001年,Numpy被集成到Scipy库中,并进一步扩展了多维数组和矩阵运算的功能。
numpy的核心:多维数组+数值计算(支持大量的维度数组与矩阵运算)
1.代码简洁减少Python代码中的循环。
2.底层实现:厚内核(C)+薄接口(Python),保证性能。
2. numpy基础
内存中的ndarray对象由两个部分组成,一部分是元数据,是实际的数组数据,它是一个同质数组,即所有元素的数据类型必须相同。另外一部分是描述这些数据的元数据,这部分包含对目标数组的描述信息,如:ndim、dimensions、dtype、data等。实际数据将与元数据分开存放,一方面提高了内存空间的使用效率,另一方面减少了对实际数据的访问频率,提高了性能。
环境准备
要使用numpy,首先要安装numpy
pip3 install numpy
安装之后,进行导入使用
import numpy as np
下面创建一个
world_alcohol.txt
文件,后序简单使用中的部分操作都基于该文件数据。Year,WHO region,County,Beverage Types,Display Value 1986,Western Pacific,Viet nam,Wine,0 1986,Americas,Uruguay,Other,0.5 1985,Africa,Cte d'Ivoire,Wine,1.62
简单使用
1. 创建数组
创建一维和多维数组
vector = np.array([1,2,3,4,5]) # 创建一维数组
print(vector) # [1 2 3 4 5]
print(vector.shape) # (5,) 数组形状
matrix = np.array([[5,10,15],[20,25,30]]) # 创建多维数组
print(matrix)
# [[ 5 10 15]
# [20 25 30]]
print(matrix.shape) # (2, 3)
numpy数据必须统一,如不统一将自动转换
numbers = np.array([1,2,3,'4'])
print(numbers) # ['1' '2' '3' '4']
print(numbers.dtype) # <U21
2. array的参数
shape:返回数组的形状
ndim:返回数组的维数
size:返回数组中所有元素的总个数
dtype:返回数组中元素的数据类型
itemsize:返回数组中每个元素的字节大小
nbytes:返回数组占用的总字节数
import numpy as np
a = np.arange(15).reshape(3,5)
# array([[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14]])
a.shape # 形状
# (3,5)
a.ndim # 纬度,因为只有行和列
# 2
a.dtype.name # type类型是什么
# int32
a.size # 多少个元素
#15
3. 读取&保存文件
world_alcohol = np.genfromtxt("world_alcohol.txt", delimiter=",", dtype=str, skip_header=1)
uruguay_other_1986 = world_alcohol[1,4]
third_country = world_alcohol[2,2]
print(uruguay_other_1986) # 0.5
print(third_country) # Cte d'Ivoire
np.savetxt('array.txt', world_alcohol, delimiter=",", fmt="%s")
4. 字符串操作
numpy字符串的操作方法和python字符串还是比较相似的。
str_list = ['-Hello-', 'wor-ld-']
strip 去除左右的符号
array = np.char.strip(str_list, '-') # array(['Hello', 'wor-ld'], dtype='<U7') np.char.rstrip(str_list, '-') # 只去除右边的 # array(['-Hello', 'wor-ld'], dtype='<U7')
upper 转大写
array = np.char.upper(str_list) # array(['HELLO', 'WORLD'], dtype='<U5')
replace 替换
np.char.replace(array,'world','python') # array(['HELLO', 'WORLD'], dtype='<U5')
add 字符串添加
np.char.add(['中国','国庆'],['海军','大阅兵']) # array(['中国海军', '国庆大阅兵'], dtype='<U5')
multiply 相乘
np.char.multiply(['中国','万岁'], 3) # array(['中国中国中国', '万岁万岁万岁'], dtype='<U6')
join 连接
np.char.join([':','-'],['hello','world']) # array(['h:e:l:l:o', 'w-o-r-l-d'], dtype='<U9')
split 分割
str1 = "第一天学习了numpy\t我很开心11\t因为又学习了1个新的知识Numpy\n" arr = str1.split('\t') # ['第一天学习了numpy', '我很开心11', '因为又学习了1个新的知识Numpy\n'] <class 'list'>
find 查找索引位置,-1代表没有出现
np.char.find(arr,'numpy') # array([ 6, -1, -1])
islower 判断是只否包含小写字母
np.char.islower(arr) # array([ True, False, False])
isdigit 判断是否只包含数字
np.char.isdigit(arr) # array([False, False, False])
isalpha 判断是否只包含字母
np.char.isalpha(arr) # array([ True, False, False])
count 计数
np.char.count(arr,'numpy') # array([1, 0, 0])
startswith 以…开始
np.char.startswith(arr,'第一天') # array([ True, False, False])
endswith 以…结束
np.char.endswith(arr,'numpy') # array([ True, False, False])
5. 随机数相关
random 产生 [0.0, 1.0) 之间的浮点数
np.random.random() # 0.9554174825034638 np.random.random(5) # array([0.09838372, 0.91571684, 0.10749174, 0.93983929, 0.80454012]) np.random.random((2,2)) # array([[0.10535918, 0.8644841 ], # [0.07228631, 0.74962662]])
seed 随机数种子
np.random.seed(123) # 初始化值固定的话再运行random值也是固定的
rand 产生均匀分布的随机数,即每个数的概率是一样的
np.random.rand(2, 2) # array([[0.2058794 , 0.95992679, 0.12515654], # [0.24656062, 0.96191233, 0.60677466]])
randint 产生[x, y)之间的整数
np.random.randint(0,100,size=10) # 产生0-100之间的整数 # array([57, 71, 48, 63, 26, 66, 51, 2, 41, 60]) np.random.randint(-10,10,size=[2,3]) # array([[ -9, 7, -8], # [ 6, -10, -4]])
uniform 产生给定范围的随机数,含小数
np.random.uniform(low=0,high=10,size=10) np.random.uniform(low=0,high=10,size=(2,5)) # array([[8.04026368, 8.57651787, 9.22382355, 3.03380734, 3.39810854], # [6.17186089, 4.04739486, 9.92478436, 0.98851285, 2.20603318]]) np.set_printoptions(precision=3) # 控制小数位数 np.random.uniform(low=0,high=10,size=(2,5)) # array([[2.286, 2.281, 9.429, 1.367, 1.147], # [8.703, 9.933, 2.88 , 8.927, 6.642]])
normal 正态分布
np.random.normal(1,3,size=5) # 实现正太分布,均值为1,标准差为3 # array([-2.148, -1.894, -3.012, -1.264, 3.314])
mean 计算均值
np.mean(np.random.normal(1,3,size=10000)) # 因为是随机数,数据越多,越接近1 # 0.94732283465293
std 计算标准差
np.std(np.random.normal(1,3,size=10000)) # 因为是随机数,数据越多,越接近差值 # 2.992792860121099
randn 产生标准正太分布随机数
np.random.randn(2,4) # array([[ 0.05 , -0.152, -1.183, -1.605], # [-0.269, -1.426, 2.038, -0.352]])
随机排序
s = np.array([1,2,5,6,7,8,9]) np.random.shuffle(s) # 随机排序,直接影响本身 print(s) # [2 7 1 6 8 5 9] t = np.random.permutation(s) # 随机排序,不影响本身 print(s,t) # [2 7 1 6 8 5 9], [6 7 9 5 8 2 1]
6. 统计相关函数
NumPy中有许多用于统计分析的函数,掌握常用的统计相关函数。
针对二维数组:需要注意轴的概念,0和1分别代表纵轴和横轴
data = np.random.random((2,3))
# array([[0.41974842, 0.73147378, 0.40841294],
# [0.00162555, 0.68542205, 0.69612774]])
print(data.sum(axis=1)) # 对行进行求和
print(data.mean(axis=1)) # 对行进行计算均值
print(data.max()) # 求最大值
print(data.min()) # 求最小值
print(data.cumsum()) # 累计求和
print(data.cumprod()) # 累计求积
np.ptp(data) # 计算极差,最大值减最小值 data.max() - data.min()
np.sum(data > 0.5) # 计算有多少个符合条件的数据
np.percentile(data,[0,50,100]) # 计算分位数值
sum 求和
data.sum() # 全部求和 # 2.9428104748854564 data.sum(axis=0) # 对列求和 # array([0.42137396, 1.41689583, 1.10454068]) np.sum(data > 0.5) # 计算有多少个符合条件的数据
mean 计算均值
data.mean() # 计算所有数的均值 data.mean(axis=0) # 对列计算均值
max 取最大值
data.max() # 取所有数中的最大值 data.max(axis=1) # 按行取最大值 # array([0.73147378, 0.69612774])
min 取最小值
data.max() # 取所有数中的最小值 data.max(axis=1) # 按行取最小值
np.ptp 计算极差
np.ptp(data) # 计算极差,最大值减最小值 data.max() - data.min() np.ptp(data, axis=0) # 按列计算极差
cumsum 逐个求和
data.cumsum() # array([0.41974842, 1.1512222 , 1.55963513, 1.56126068, 2.24668273, 2.94281047]) data.cumsum(axis=0) # 按列逐个求和 # array([[0.41974842, 0.73147378, 0.40841294], # [0.42137396, 1.41689583, 1.10454068]])
cumprod 逐个求积
data.cumprod() data.cumsum(axis=1) # 按行逐个求积
7. 线性代数
- 了解矩阵乘法
- 二维数组中,第一个矩阵的列数必须要与第二个矩阵的行数相等
(即第一个矩阵的行 * 第二个矩阵的列) 比较绕口
- 了解矩阵的转置和求逆
- 多远一次方程组求解
矩阵乘法
# 如果a和b都是一维数组,那么它返回的就是向量的内积。 a = np.array([1,2,3]) b = np.array([4,5,6]) vector = np.dot(a,b) # 1*4 + 2*5 + 3*6 = 32 arr5 = np.array([5,15,25,40]).reshape(4,1) arr6 = np.arange(12).reshape(3,4) arr2d = np.dot(arr6,arr5) # array([[185], [525], [865]]) # 如果arr9和arr10都是二维数组,那么它返回的是矩阵乘法。 arr9 = np.array([[6,-1],[8,1]]) # [[ 6 -1] # [ 8 1]] arr10 = np.array([[6,10],[-1,1]]) # [[ 6 10] # [-1 1]] np.dot(arr9,arr10) # array([[37, 59], 37 = (6 * 6) + (-1 * -1) 59=(6*10) + (-1 * 1) # [47, 81]])
矩阵的转置
data2 = ((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),(3.2,4.5,6,3,9),(11.2,13.4,15.6,17.8,19),(12,3.4,1.2,4,7)) arr2 = np.array(data2) np.transpose(arr2) # 行列转换 np.diag(arr2) # 取对角线上的元素,左上角开始到右下
多元一次方程组求解
3x + 2y + z = 38 2x + 3y + z = 34 x + 2y + 3z = 26
A = np.array([[3,2,1],[2,3,1],[1,2,3]]) b = np.array([[39],[34],[26]]) np.linalg.solve(A,b) # array([[9.25], # [4.25], # [2.75]])
8. 矩阵操作
a = np.array([[1,2],[7,8]])
b = np.array([[3,4],[9,10]])
c = np.array([[5,6],[11,12]])
np.concatenate 矩阵拼接
e = np.concatenate([a,c,b], axis=1) # 按行拼接,默认按列进行拼接 # array([[ 1, 2, 5, 6, 3, 4], # [ 7, 8, 11, 12, 9, 10]])
数值判断
判断值否相等
numbers = numpy.array([5,10,15,20]) numbers == 10 # array([False, True, False, False]) matrix = numpy.array([ [5,10,15], [20,25,30] ]) matrix == 25 # array([[False, False, False], # [False, True, False]])
获取并修改选中的值
numbers = numpy.array([5,10,15,20]) equal_to_ten = (numbers==10) print(equal_to_ten) # [False True False False] print(numbers[equal_to_ten]) # [10] vector = numpy.array([5,10,15,20]) equal_to_ten_and_five = (vector==10) | (vector==5) print(equal_to_ten_and_five) # [ True True False False] vector[equal_to_ten_and_five] = 50 print(vector) # [50 50 15 20]