📋前言📋 💝博客:【红目香薰的博客_CSDN博客-计算机理论,2022年蓝桥杯,MySQL领域博主】💝 ✍本文由在下【红目香薰】原创,首发于CSDN✍ 🤗2022年最大愿望:【服务百万技术人次】🤗 💝Python初始环境地址:【Python可视化数据分析01、python环境搭建】💝
环境需求 环境:win10 开发工具:PyCharm Community Edition 2021.2 数据库:MySQL5.6
NumPy(Numerical Python)是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 NumPy通常与SciPy【saipai】(Scientific Python)和Matplotlib(绘图库)一起使用。SciPy是一个开源的Python算法库和数学工具包。Matplotlib是Python编程语言及其数值数学扩展包NumPy的可视化操作界面。主要用于数学、科学和工程计算。
pip3 install numpy
网络慢的话就换镜像地址
pip3 config set global.index-url https://repo.huaweicloud.com/repository/pypi/simple
pip3 config list
Ndarray对象是用于存放同类型元素的多维数组,每个元素在内存中都有相同存储大小的区域。
Ndarray对象由以下内容组成:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
object:数组或嵌套的数列。 dtype:数组元素的数据类型,可选。 copy:对象是否需要复制,可选。 order:创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)。 subok:默认返回一个与基类类型一致的数组。 ndmin:指定生成数组的最小维度。
import numpy as np
a = np.array([1, 2, 3])
print("基础数组:")
print(a)
# 大于一个维度
a = np.array([[1, 2], [3, 4]])
print("二维数组:")
print(a)
# 设置最小维度
a = np.array([1, 2, 3, 4, 5], ndmin=30)
print("设置最小数组层:")
print(a)
类型 | 字符代码 |
---|---|
bool | ?, b1 |
int8 | b, i1 |
uint8 | B, u1 |
int16 | h, i2 |
uint16 | H, u2 |
int32 | i, i4 |
uint32 | I, u4 |
int64 | q, i8 |
uint64 | Q, u8 |
float16 | f2, e |
float32 | f4, f |
float64 | f8, d |
complex64 | F4, F |
complex128 | F8, D |
str | a, S(可以在S后面添加数字,表示字符串长度, 比如S3表示长度为三的字符串,不写则为最大长度) |
unicode | U |
object | O |
void | V |
import numpy as np
dt = np.dtype('i1') # int8, int16, int32, int64四种数据类型可以使用 'i1', 'i2','i4','i8' 代替
print(dt)
dt = np.dtype('<i1') # 字节顺序标注
print(dt)
dt = np.dtype([('age', np.int8)]) # 创建结构化数据类型
print(dt)
dt = np.dtype([('age', np.int8)]) # 将数据类型应用于ndarray对象
a = np.array([(10,), (20,), (30,)], dtype=dt)
print(a)
dt = np.dtype([('age', np.int8)]) # 类型字段名可以用于存取实际的age列
a = np.array([(10,), (20,), (30,)], dtype=dt)
print(a['age'])
# 结构化数据类型student,包含字符串字段name(大写字母O,代表Object类型),整数字段age,及浮点字段marks
student = np.dtype([('name', 'O'), ('age', 'i4'), ('marks', 'f4')])
print(student)
a = np.array([("文争鸣", 21, 50), ("祝枝山", 18, 75)], dtype=student)
print(a)
NumPy数组的维数称为秩(zhì)(rank),一维数组的秩为1,二维数组的秩为2,以此类推。 在NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。而轴的数量——秩,就是数组的维数。
属性 | 说明 |
---|---|
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,即为n行m列 |
ndarray.size | 数组元素的总个数,相当于.shape中n*m的值 |
ndarray.dtype | ndarray对象的元素类型 |
ndarray.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray对象的内存信息 |
ndarray.real | ndarray元素的实部 |
ndarray.imag | ndarray元素的虚部 |
ndarray.data | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素, 所以通常不需要使用这个属性。 |
示例1:
import numpy as np
a = np.arange(24)
print("一维一值", a.ndim) # a只有一个维度
b = a.reshape(2, 4, 3) # 现在调整其大小,b拥有三个维度
print("一维三值", b.ndim)
a = np.array([[1, 2, 3], [4, 5, 6]]) # 数组的维度
print("二维,三值", a.shape)
a = np.array([[1, 2, 3], [4, 5, 6]]) # 调整数组大小
a.shape = (3, 2)
print("三维二值", a)
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.reshape(3, 2) # reshape 函数来调整数组大小
print("三维二值", b)
# 以字节的形式返回数组中每一个元素的大小
x = np.array([1, 2, 3, 4, 5], dtype=np.int8) # 数组的dtype为 int8(一个字节)
print("所占用字节长度:", x.itemsize)
y = np.array([1, 2, 3, 4, 5], dtype=np.float64) # 数组的 dtype为float64(8个字节)
print("所占用字节长度:", y.itemsize)
示例2:
import numpy as np
x = np.empty([3, 2], dtype=int) # empty 方法使用
print("随机", x)
x = np.zeros(5) # 默认为浮点数
print("空浮点数", x)
y = np.zeros((5,), dtype=np.int32) # 设置类型为整数
print("空整数", y)
# 自定义类型
z = np.zeros((2, 2), dtype=[('x', 'i4'), ('y', 'i4')])
print("俩二维数组,长度是2", z)
x = np.ones(5) # 默认为浮点数
print("长度5的浮点数", x)
# 自定义类型
x = np.ones([2, 2], dtype=int)
print("一个二维数组,值是2个:", x)
示例3:
import numpy as np
a = np.arange(5, 15) # 10个数
print(a) # 打印5-14
s = slice(2, 7, 2) # 从索引2开始到索引7停止,间隔为2
print(a[s])
a = np.arange(5, 15) # 10个数
print(a[2:7:2]) # 从索引2开始到索引7停止,间隔为2
a = np.arange(5, 15) # 10个数
print("下标是五:", a[5])
a = np.arange(5, 15) # 10个数
print(a[2:]) # 从下标是2开始打印
a = np.arange(5, 15) # 10个数
print("从下标2打印到下标5:", a[2:5])
print(np.array([[1, 2, 3], [3, 4, 5], [4, 5, 6]]))
print('从数组索引 a[1:] 处开始切割')
print(a[1:])
a = np.array([[1, 2, 3], [3, 4, 5], [4, 5, 6]])
print(a[..., 1]) # 第2列元素
print(a[1, ...]) # 第2行元素
print(a[..., 1:]) # 第2列及剩下的所有元素
除了对Ndarray数组进行切片操作和索引操作,还可以对Ndarray数组进行整数数组索引、布尔索引及花式索引。
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0, 1, 2], [0, 1, 0]]
print(y)
# 4X3 数组中的四个角的元素。行索引是[0,0]和[3,3],而列索引是[0,2]和[0,2]
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('我们的数组是:')
print(x)
print('\n')
rows = np.array([[0, 0], [3, 3]])
cols = np.array([[0, 2], [0, 2]])
y = x[rows, cols]
print('这个数组的四个角元素是:')
print(y)
import numpy as np
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('我们的数组是:')
print(x)
# 现在打印出大于5的元素
print('大于5的元素是:')
print(x[x > 5])
import numpy as np
x = np.arange(32).reshape((8, 4)) # 传入顺序索引数组
print(x[[4, 2, 1, 7]])
print('\n')
x = np.arange(32).reshape((8, 4)) # 传入倒序索引数组
print(x[[-4, -2, -1, -7]])
print('\n')
x = np.arange(32).reshape((8, 4)) # 传入多个索引数组
print(x[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])])
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
print(a * b, '\n')
# 当运算中的2个数组的形状不同时,numpy将自动触发广播机制
a = np.array([[0, 0, 0],
[10, 10, 10],
[20, 20, 20],
[30, 30, 30]])
b = np.array([1, 2, 3])
print(a + b, '\n')
# 4x3的二维数组与长为3的一维数组相加,等效于把数组b在二维上重复4次再运算
a = np.array([[0, 0, 0],
[10, 10, 10],
[20, 20, 20],
[30, 30, 30]])
b = np.array([1, 2, 3])
bb = np.tile(b, (4, 1))
print(a + bb)
控制遍历顺序 使用numpy.nditer迭代器对象可以根据需要,采用列序优先或行序优先的方式控制遍历顺序。具体说明如下: for x in np.nditer(a, order='F'):Fortran order,列序优先。 for x in np.nditer(a.T, order='C'):C order,行序优先
F风格:
import numpy as np
a = np.arange(0, 60, 5)
a = a.reshape(3, 4)
print('原始数组是:')
print(a, '\n')
print('原始数组的转置是:')
b = a.T
print(b, '\n')
print('以 F 风格顺序排序:')
c = b.copy(order='F')
print(c)
for x in np.nditer(c):
print(x, end=", ")
C风格:
import numpy as np
a = np.arange(0, 60, 5)
a = a.reshape(3, 4)
print('原始数组是:')
print(a, '\n')
print('原始数组的转置是:')
b = a.T
print(b, '\n')
print('以 C 风格顺序排序:')
c = b.copy(order='C')
print(c)
for x in np.nditer(c):
print(x, end=", ")
修改数组值:
import numpy as np
a = np.arange(0, 60, 5)
a = a.reshape(3, 4)
print('原始数组是:')
print(a, '\n')
for x in np.nditer(a, op_flags=['readwrite']):
x[...] = 2 * x
print('修改后的数组是:\n', a)
NumPy中有专门处理字符串的函数,这些函数包含在numpy.char中。 NumPy字符串的函数的说明见下表:
函数 | 描述 |
---|---|
add() | 对两个数组的逐个字符串元素进行连接 |
multiply() | 返回按元素多重连接后的字符串 |
center() | 居中字符串,并使用指定字符在左侧和右侧进行填充 |
capitalize() | 将字符串第一个字母转换为大写 |
title() | 将字符串的每个单词的第一个字母转换为大写 |
lower() | 数组元素转换为小写,它对每个元素调用str.lower()函数 |
---|---|
upper() | 数组元素转换为大写,它对每个元素调用str.upper()函数 |
split() | 指定分隔符对字符串进行分割,并返回数组列表。默认情况下,分隔符为空格 |
splitlines() | 返回元素中的行列表,以换行符分割 |
strip() | 移除元素开头或者结尾处的特定字符 |
join() | 通过指定分隔符来连接数组中的元素 |
replace() | 使用新字符串替换字符串中的所有子字符串 |
encode() | 对数组中的每个元素调用str.encode()函数。默认编码是utf-8,可以使用标准Python库中的编解码器 |
decode() | 对编码的元素进行str.decode()解码 |
import numpy as np
print('连接两个字符串:')
print(np.char.add(['hello'], [' The World']))
print('连接示例:')
print(np.char.add(['hello', 'girl'], [' Hi', ' boy']))
print(np.char.multiply('幸福安康*3', 3))
print(np.char.center('幸福安康', 20, fillchar='*'))
print(np.char.capitalize('幸福安康'))
print(np.char.title('i like 幸福安康'))
print(np.char.lower(['幸福安康', 'GOOGLE'])) # 操作数组
print(np.char.lower('幸福安康')) # 操作字符串
print(np.char.upper(['幸福安康', '和谐美满'])) # 操作数组
print(np.char.upper('幸福安康')) # 操作字符串
print(np.char.split('i like 幸福安康?')) # 分隔符默认为空格
print(np.char.split('www.baidu.com', sep='.')) # 分隔符为 .
print(np.char.splitlines('i\nlike 幸福安康?')) # 换行符 \n
print(np.char.splitlines('i\rlike 幸福安康?'))
# 移除字符串头尾的 a 字符
print(np.char.strip('ashok 幸福安康的', '的'))
# 移除数组元素头尾的 a 字符
print(np.char.strip(['幸福安康', 'admin', 'java'], 'a'))
print(np.char.join(':', '幸福安康')) # 操作字符串
# 指定多个分隔符操作数组元素
print(np.char.join([':', '-'], ['幸福安康', '和谐美满']))
print(np.char.replace('i like 幸福安康', 'oo', 'cc'))
a = np.char.encode('幸福安康', 'utf-8')
print(a)
print(np.char.encode('幸福安康', 'utf-8'))
print(np.char.decode(a, 'utf-8'))
舍入函数
around()函数:返回指定数字的四舍五入值。 floor()函数:返回数字的下舍整数。 ceil()函数:返回数字的上入整数。
算术函数
add()函数:返回指定数字的加法。 subtract()函数:返回指定数字的减法。 multiply()函数:返回指定数字的乘法。 divide()函数:返回指定数字的除法。 reciprocal()函数:返回参数逐元素的倒数。 power()函数:将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。 mod()函数:计算输入数组中相应元素的相除后的余数
统计函数
amin()函数:用于计算数组中的元素沿指定轴的最小值。 amax()函数:用于计算数组中的元素沿指定轴的最大值。 ptp()函数:计算数组中元素最大值与最小值的差(最大值-最小值)。 median()函数:用于计算数组中元素的中位数(中值)。 mean()函数:返回数组中元素的算术平均值。 average()函数:根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值
SciPy是一个用于数学、科学和工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值的求解和信号处理等问题。 Numpy和SciPy协同工作,可以高效解决数据处理问题。
安装SciPy
pip3 install scipy
模块名 | 应用领域 |
---|---|
scipy.cluster | 向量计算/Kmeans |
scipy.constants | 物理和数学常量 |
scipy.fftpack | 傅立叶变换 |
scipy.integrate | 积分程序 |
scipy.interpolate | 插值 |
scipy.io | 数据输入输出 |
scipy.linalg | 线性代数程序 |
---|---|
scipy.ndimagen | 维图像包 |
scipy.odr | 正交距离回归 |
scipy.optimize | 优化 |
scipy.signal | 信号处理 |
scipy.sparse | 稀疏矩阵 |
scipy.spatial | 空间数据结构和算法 |
scipy.special | 一些特殊的数学函数 |
scipy.stats | 统计 |
from scipy import io as spio
import numpy as np
a = np.ones((5, 2, 7))
# 写入
spio.savemat('f.mat', {'a': a})
# 读取
data = spio.loadmat('f.mat', struct_as_record=True)
print(data['a'])
该模块的distance()函数用于计算两点之间的距离
在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。较早的文献称之为毕达哥拉斯度量。
欧氏距离
|x| = √( x[1]2 + x[2]2 + … + x[n]2 )
from scipy.spatial.distance import cdist
import numpy as np
x1 = np.array([[1, 2]])
x2 = np.array([[4, 5]])
# 通过cdist函数,计算两个点之间的距离·欧氏距离
distance = cdist(x1, x2, "euclidean")
print(distance)
这块很多时候需要具体问题具体分析,用的时候搜索公式就行了。