简介
高级数组工具
安装
pip install numpy
文档查询
https://numpy.org/doc/stable/reference/index.html
简单了解
- Numpy(Numerical Python)
- Numpy是运行速度非常快的数学库。
- Numpy是一个多维数组对象,称为ndarray。
- Numpy是python开源的科学计算工具包,属于高级的数值编程工具。
-
Numpy支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。可以进行线性代数、傅里叶变换、随机数生成等功能的运算。
-
Numpy通常与SciPy(Scientific Python)和Matplotlib(绘图库)一起使用,这种组合广泛用于替代MatLab,是一个强大的科学计算环境。
更多了解
【优势】
-
创建n维数组(矩阵)。
-
对数组进行函数运算,使用函数计算十分快速‘节省了大量的时间,且不需要编写循环,十分方便。
-
ndarray快速节省空间的多维数组。
-
提供数组化的算术运算和高级的广播功能。
【劣势】
-
对于数值运算来说这种结构比较浪费内存和CPU资源。
【应用】
-
金融:用于衡量投资组合的风险,通过以往大量的数据对比分析未来走势。
-
统计分析:评估产值,市场调研某产品适用人群的占比...
-
质量控制:检测产品尺寸的变化,一些细节的处理,提高产品质量。
-
数据建模:在机器学习中,评估模型的泛化能力,帮助调整模型。’
【关联模块】
sciPy是一个开源的Python算法库和数学工具包。
sciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解、和其他科学与工程中常用的计算。
scipy包含各种专用于科学计算中常见问题的工具箱。其不同的子模块对应不同的应用,如插值、积分、优化、图像处理、统计、特殊函数等。
scipy是 Python 中科学计算的核心包,与numpy组合使用,才能充分的发挥其效果。
参数列表
array | |
array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None) | |
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
位运算 | |
bitwise_and | 对数组元素执行位与操作 |
bitwise_or | 对数组元素执行位或操作 |
invert | 按位取反 |
left_shift | 向左移动二进制表示的位 |
right_shift | 向右移动二进制表示的位 |
字符串函数 | |
add() | 对两个数组的逐个字符串元素进行连接 |
multiply() | 返回按元素多重连接后的字符串 |
center() | 居中字符串 |
capitalize() | 将字符串第一个字母转换为大写 |
title() | 将字符串的每个单词的第一个字母转换为大写 |
lower() | 数组元素转换为小写 |
upper() | 数组元素转换为大写 |
split() | 指定分隔符对字符串进行分割,并返回数组列表 |
splitlines() | 返回元素中的行列表,以换行符分割 |
strip() | 移除元素开头或者结尾处的特定字符 |
join() | 通过指定分隔符来连接数组中的元素 |
replace() | 使用新字符串替换字符串中的所有子字符串 |
参考代码
数组(基本方法)
import numpy
# 每个数组的长度必须一致
arr = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# print(arr) # >>> [[1 2 3][4 5 6][7 8 9]]
# print(type(arr)) # >>> <class 'numpy.ndarray'>
""" 数据类型(获取) """
# print(arr.dtype) # >>> int32
""" 数据类型(设置) """
# print(arr.astype(numpy.int64))
""" 几维数组 """
# print(arr.ndim) # >>> 2
""" 行列(互换) """
# print(arr.transpose()) # >>> [[1 4 7][2 5 8][3 6 9]]
# print(arr.T) # >>> [[1 4 7][2 5 8][3 6 9]]
""" 行列(转换) """
# print(arr.reshape(1,9)) # >>> [[1 2 3 4 5 6 7 8 9]]
""" 数组维度 """
# print(arr.shape) # >>> (3, 3) # 几行,几列
""" 内存信息 """
# print(arr.flags) # ndarray对象的内存信息。
""" 元素数量 """
# print(arr.size) # >>> 9
""" 字节大小 """
# print(arr.itemsize) # >>> 4 # 每个元素的字节大小
""" 复制数组 """
# arr_2 = arr.copy()
""" 创建数组 """
# print(numpy.array(range(5))) # >>> [0 1 2 3 4]
# print(numpy.array(range(5),dtype=float)) # >>> [0. 1. 2. 3. 4.]
# print(numpy.arange(5)) # >>> [0 1 2 3 4]
# print(numpy.arange(0, 10)) # >>> [0 1 2 3 4 5 6 7 8 9]
# print(numpy.arange(0, 10, 2)) # >>> [0 2 4 6 8]
""" 等差数列 """
# print(numpy.linspace(10,15,num=5)) # >>> [10. 11.25 12.5 13.75 15. ]
# print(numpy.linspace(10,15,num=3)) # >>> [10. 12.5 15. ]
""" 等比数列 """
# print(numpy.logspace(0,9,num=4)) # >>> [1.e+00 1.e+03 1.e+06 1.e+09]
# print(numpy.logspace(0,20,num=5)) # >>> [1.e+00 1.e+05 1.e+10 1.e+15 1.e+20]
""" 单位矩阵 """
# print(numpy.eye(3,dtype=int)) # >>> [[1 0 0][0 1 0][0 0 1]]
""" 排列(严格模式) """
# print(numpy.reshape(numpy.arange(6),(2,3))) # >>> [[0 1 2][3 4 5]]
""" 排列(懒惰模式) """
# print(numpy.resize(numpy.arange(7),(2,3))) # >>> [[0 1 2][3 4 5]]
数组(增删改)
import numpy
# 每个数组的长度必须一致
arr = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
""" 数组(添加) """
# print(numpy.append(arr,[100,200,300])) # >>> [1 2 3 4 5 6 7 8 9 100 200 300]
""" 数组(插入) """
# print(numpy.insert(arr,1,[0,0,0])) # >>> [1 0 0 0 2 3 4 5 6 7 8 9]
""" 数组(删除) """
# print(numpy.delete(arr,[6,7])) # >>> [1 2 3 4 5 6 9] # 索引位置删除
# print(numpy.delete(arr,2,axis=0)) # >>> [[1 2 3][4 5 6]] # 整个行删除
# print(numpy.delete(arr,numpy.s_[::2])) # >>> [2 4 6 8] # 按照步长删除
# print(numpy.delete(arr,numpy.s_[2:])) # >>> [1 2] # 指定位置开始删除
# print(numpy.delete(arr,numpy.s_[1:8])) # >>> [1 9] # 指定范围内的删除
""" 数组(展开) """
# print(arr.flatten()) # >>> [1 2 3 4 5 6 7 8 9]
# print(arr.ravel()) # >>> [1 2 3 4 5 6 7 8 9]
""" 数组(填充) """
# print(numpy.zeros(5)) # >>> [0. 0. 0. 0. 0.]
# print(numpy.ones(5)) # >>> [1. 1. 1. 1. 1.]
""" 数组(唯一) """
# print(numpy.unique([1,1,2,3,3,3])) # >>> [1 2 3] # 查找数组内的唯一元素
数组(合并与拆分)
import numpy
""" 水平或垂直合并 """
a1 = numpy.arange(3) # >>> [0 1 2]
a2 = numpy.arange(3, 6) # >>> [3 4 5]
# print(numpy.hstack((a1, a2))) # >>> [0 1 2 3 4 5] # 水平合并
# print(numpy.vstack((a1, a2))) # >>> [[0 1 2][3 4 5]] # 垂直合并
b1 = numpy.array([[1], [2], [3]])
b2 = numpy.array([["a"], ["b"], ["c"]])
# print(numpy.hstack((b1, b2))) # >>> [['1' 'a']['2' 'b']['3' 'c']]
# print(numpy.vstack((b1, b2))) # >>> [['1']['2']['3']['a']['b']['c']]
""" 数组合并 """
c1 = numpy.array([[1,2],[3,4]])
c2 = numpy.array([[10,20],[30,40]])
# print(numpy.concatenate((c1,c2))) # >>> [[1 2][ 3 4][10 20][30 40]] # 合并
# print(numpy.concatenate((c1,c2),axis=0)) # >>> [[1 2][ 3 4][10 20][30 40]] # 合并(行)
# print(numpy.concatenate((c1,c2),axis=1)) # >>> [[1 2 10 20][3 4 30 40]] # 合并(列)
""" 数组拆分 """
arr2D = numpy.arange(9).reshape(3, 3) # >>> [[0 1 2][3 4 5][6 7 8]]
# print(numpy.hsplit(arr2D,3)[0]) # >>> [[0][3][6]] # 水平拆分
# print(numpy.vsplit(arr2D,3)[0]) # >>> [[0 1 2]] # 垂直拆分
数组(运算)
import numpy
"""
numpy.sin(arr) 正弦
numpy.cos(arr) 余弦
numpy.tan(arr) 正切
numpy.arcsin(arr) 反正弦
numpy.arccos(arr) 反余弦
numpy.arctan(arr) 反正切
numpy.exp(arr) 指数函数
numpy.sqrt(arr) 开根号
一元函数: abs, sqrt, exp, log, ceil, round, floor, rint, trunc, modf, isnan, isinf, cos, sin, tan
二元函数: add, substract, multiply, divide, power, mod, maximum, mininum
"""
m = numpy.arange(6).reshape(2, 3) # >>> [[0 1 2][3 4 5]]
""" 加减乘除 """
# 方法1
# print(m + 1) # >>> [[1 2 3][4 5 6]]
# print(m - 1) # >>> [[-1 0 1][ 2 3 4]]
# print(m * 2) # >>> [[ 0 2 4][ 6 8 10]]
# print(1 / (m + 1)) # >>> [[1. 0.5 0.33333333][0.25 0.2 0.16666667]]
# 方法2
m1 = numpy.array([[4,15],[10,35]])
m2 = numpy.array([[1,3],[5,7]])
# print(numpy.add(m1,m2)) # >>> [[5 18][15 42]] # 加
# print(numpy.subtract(m1,m2)) # >>> [[3 12][5 28]] # 减
# print(numpy.multiply(m1,m2)) # >>> [[4 45][50 245]] # 乘
# print(numpy.divide(m1,m2)) # >>> [[4. 5.][2. 5.]] # 除
""" 向量点积 """
# print(numpy.dot([0,1,2],[0,1,2])) # >>> 5 # 向量点积(a1*b1+a2*b2+...)
""" 叠乘 """
# print(numpy.multiply([1,2,3],[1,2,3])) # >>> [1 4 9] # 乘
# print(numpy.outer([1,2],[5,10,15])) # >>> [[ 5 10 15][10 20 30]] # 叠乘
""" 幂运算 """
# print(m**3) # >>> [[ 0 1 8][ 27 64 125]]
""" 平均值 """
# 方法1
# print(numpy.mean(a=m)) # >>> 2.5 # 平均值
# print(numpy.mean(m,axis=0)) # >>> [1.5 2.5 3.5] # 平均值(行)
# print(numpy.mean(m,axis=1)) # >>> [1. 4.] # 平均值(列)
# 方法2
# print(numpy.median(m)) # >>> 2.5
# print(numpy.median(m,axis=0)) # >>> [1.5 2.5 3.5]
# print(numpy.median(m,axis=1)) # >>> 2.5
""" max,min """
# print(numpy.max(m)) # >>> 5 # 最大值
# print(numpy.min(m)) # >>> 0 # 最小值
m2=numpy.array([[1,3,0,2],[2,0,3,2]])
# print(m2.max(axis=0)) # >>> [2 3 3 2] # max的对应值(行)
# print(m2.argmax(axis=0)) # >>> [1 0 1 0] # max的对应索引(行)
# print(m2.max(axis=1)) # >>> [3 3] # max的对应值(列)
# print(m2.argmax(axis=1)) # >>> [1 2] # max的对应值(列)
# print(numpy.argmin([3,1,2,4,5])) # >>> 1 # min的对应索引
# print(numpy.argmax([2,3,5,4,1])) # >>> 2 # max的对应索引
""" 标准差 """
# print(numpy.std(m)) # >>> 1.707825127659933
""" 方差 """
# print(numpy.var(m)) # >>> 2.9166666666666665
""" 求和 """
# print(numpy.sum(m)) # >>> 15 # 总合
# print(numpy.cumsum(m)) # >>> [ 0 1 3 6 10 15] # 第n个元素为前n-1个元素累加和
# print(numpy.sum(m, axis=0)) # >>> 15 [3 5 7] # 水平相加
# print(numpy.sum(m, axis=1)) # >>> 15 [ 3 12] # 垂直相加
""" 平铺 """
# print(numpy.tile(m,(2,1))) # >>> [[0 1 2][3 4 5][0 1 2][3 4 5]]
""" 四舍五入 """
d1=numpy.array([[1.123,2.456],[3.789,4.555]])
# print(numpy.round(d1)) # >>> [[1. 2.][4. 5.]]
""" 绝对值 """
# print(numpy.abs([-1,-2,3])) # >>> [1 2 3]
# print(numpy.absolute([-2,-3,4])) # >>> [2 3 4]
""" 平方 """
# print(numpy.square([1,2,3])) # >>> [1 4 9]
""" 排序 """
# print(numpy.sort(numpy.array([1, 4, 3, 2, 5, 6]))) # >>> [1 2 3 4 5 6]
数组(元素获取)
import numpy
arr2D = numpy.arange(12).reshape(3, 4)
# print(arr2D) # >>> [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]]
# print(arr2D[1,1]) # >>> 5 # 等同于 arr2D[1][1]
# print(arr2D[:1,2:]) # >>> [[2 3]]
# print(arr2D[:1]) # >>> [[0 1 2 3]]
# print(arr2D[::2]) # >>> [[ 0 1 2 3][ 8 9 10 11]]
# print(arr2D[::-1]) # >>> [[ 8 9 10 11][ 4 5 6 7][ 0 1 2 3]]
数组(布尔值判断)
import numpy
s = numpy.arange(12).reshape(3, 4)
# print(s) # >>> [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]]
row = numpy.array(
[True, False, False]
)
column = numpy.array(
[True, True, False, False]
)
# print(s[row, :]) # >>> [[0 1 2 3]] # 保留第一行
# print(s[:, column]) # >>> [[0 1][4 5][8 9]] # 保留前两列
# print(s[s > 5]) # >>> [ 6 7 8 9 10 11]
数组(random)
import numpy
""" 随机数的条件判断 """
arrNumber = numpy.random.rand(2,3)
# print(arrNumber) # >>> [[0.4040385 0.25586712 0.98025492][0.73933662 0.24635626 0.83856925]]
arrBool = arrNumber < 0.8
# print(arrBool) # >>> [[ True True False][ True True False]]
""" 随机整数 """
# print(numpy.random.randint(5)) # >>> 3
# print(numpy.random.randint(1,5)) # >>> 1
# print(numpy.random.randint(5,size=10)) # >>> [1 4 3 2 1 1 2 0 3 3]
# print(numpy.random.randint(5,10,size=(2,2))) # >>> [[7 5][9 5]]
""" 随机浮点数-类型1 """
# print(numpy.random.rand(2)) # >>> [0.97270619 0.51185975]
# print(numpy.random.rand(2,2)) # >>> [[0.47802695 0.62404042][0.50270551 0.22062832]]
# print(numpy.random.rand(2,2)*100) # >>> [[ 4.5516591 31.96526817][18.54665825 29.90166157]]
# print(numpy.random.rand(4).reshape(1,4)) # >>> [[0.94190749 0.45243098 0.6083467 0.44261581]]
# print(numpy.random.rand(4).reshape(2,2)) # >>> [[0.55084269 0.65391016][0.95948768 0.99081886]]
""" 随机浮点数-类型2 """
# print(numpy.random.normal(size=(2,2))) # >>> [[ 0.25009147 -1.23808099][ 1.24380185 -0.44293845]]
# print(numpy.random.standard_normal((2,2))) # >>> [[-0.79393322 0.88915117][-0.3713971 -0.9275841 ]]
# print(numpy.random.standard_normal(3)) # >>> [-0.88057398 0.29794299 -1.41674055]
# print(numpy.random.randn(2,2)) # >>> [[ 0.25219723 -1.22391401][ 0.48900845 -1.53689193]]
# print(numpy.random.randn(3)) # >>> [-0.51382206 0.65768077 -0.23819675]
""" 仅限1维数组,随机排列 """
# print(numpy.random.permutation([1,2,3,4,5])) # >>> [3 5 4 2 1]
""" 0~1范围内产生随机数 """
# print(numpy.random.random_sample(2)) # >>> [0.38562772 0.42020144]
# print(numpy.random.random_sample((2,2))) # >>> [[0.41110841 0.79926067][0.80795522 0.75781746]]
""" empty方法 """
# print(numpy.empty([2,2])) # >>> [[9.90263869e+067 8.01304531e+262][2.60799828e-310 1.40688321e-311]]
# print(numpy.empty(3)) # >>> [ 6.26756526e+250 -1.06827737e-149 1.11520858e-166]
# print(numpy.empty(shape=(3),dtype=int)) # >>> [1044266506 1025531680 1953263648]
# print(numpy.empty(shape=(2,2),dtype=numpy.int8)) # >>> [[0 0][0 0]] # >>> 空的多维数组
# print(numpy.empty(shape=(3),dtype=float)) # >>> [ 9.84972389e-312 9.84972389e-312 -1.73811448e-088]
# print(numpy.empty(shape=(3),dtype=numpy.float16)) # >>> [-2.304e+04 6.131e-02 2.766e-05]
""" 随机抽取 """
# print(numpy.random.choice(a=[1,2,3,4,5],size=(2))) # >>> [5 1]
# print(numpy.random.choice(a=[1,2,3,4,5],size=(2,2))) # >>> [[3 1][5 4]]
""" 给定形状产生随机数组 """
# print(numpy.random.uniform(low=1,high=5,size=(2))) # >>> [3.93644384 3.79101644]
# print(numpy.random.uniform(1,5,size=(2,2))) # >>> [[2.90634328 4.17696447][1.83768879 1.75956575]]
""" 仅限随机1次,后续数据相同 """
# print(numpy.random.RandomState(0).rand(3)) # >>> [0.5488135 0.71518937 0.60276338]
# print(numpy.random.RandomState(1).rand(3)) # >>> [4.17022005e-01 7.20324493e-01 1.14374817e-04] # 科学记数法
""" 无限制随机 """
# print(numpy.random.RandomState().rand(3)) # >>> [0.32202852 0.82726346 0.59902676]
""" 0 默认数字 1 科学记数法 """
# numpy.random.seed(1)
# print(numpy.random.rand(2,2)) # >>> [[4.17022005e-01 7.20324493e-01][1.14374817e-04 3.02332573e-01]]
数组(动态数组)
import numpy
# numpy.frombuffer 用于实现动态数组
"""
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
buffer 可以是任意对象,会以流的形式读入。
dype 返回数组的数据类型,可选。
count 读取数据数量,默认为-1,读取所有数据。
offset 读取的起始位置,默认为0
"""
data =b'hello world!' # 接受 buffer 输入参数,以流的形式读入转化成 ndarray 对象。
r1 = numpy.frombuffer(data,dtype='S3',offset=0,count=-1) # buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。
r2 = numpy.frombuffer(data,dtype='S4')
r3 = numpy.frombuffer(data,dtype='S3',count=1)
# print(r1) # >>> [b'hel' b'lo ' b'wor' b'ld!']
# print(r2) # >>> [b'hell' b'o wo' b'rld!']
# print(r3) # >>> [b'hel']
数组(转ASCII编码)
import numpy
# 数组元素转ASCII编码
abc = "abcdef"
# print(numpy.fromstring(abc,dtype=numpy.int8))
# >>> [ 97 98 99 100 101 102]
Numpy文件操作
import numpy as N
import os
fileName="data.npy"
# 存储为npy文件
'''
os.chdir("C:/Users/Administrator/Desktop/")
arr=N.random.rand(5,5)
N.save(fileName,arr)
'''
# 读取npy文件
'''
os.chdir("C:/Users/Administrator/Desktop/")
loadFile=N.load(fileName)
print(loadFile)
'''
# 存储为文本文件(默认为科学记数法)
os.chdir("C:/Users/Administrator/Desktop/")
arr=N.random.rand(5,5)
# N.savetxt("data.txt",arr,delimiter=",",fmt="%2f") # fmt 浮点型
# N.savetxt("data2.txt",arr,delimiter=",") # delimiter 分隔
# 读取文本文件
# loadFileTxt=N.loadtxt("data2.txt",delimiter=",")
# print(loadFileTxt)
简单例子(弧度角度运算)
import numpy
# 角度转弧度
t = numpy.array([0,30,60])
# 通过乘 pi/180 转化为弧度
# print (numpy.sin(t*numpy.pi/180)) # 正弦值 # >>> [0. 0.5 0.8660254]
# print (numpy.cos(t*numpy.pi/180)) # 角度的余弦值 # >>> [1. 0.8660254 0.5]
# print (numpy.tan(t*numpy.pi/180)) # 正切值 # >>> [0. 0.57735027 1.73205081]
# 弧度转角度
"""
deg = 0 # 角度
arc = 0.5 # 弧度
hundred = 100
while True:
if(numpy.round(arc*hundred) == numpy.round(numpy.sin(numpy.array([deg])*numpy.pi/180)[0]*hundred)):
print("角度:",deg)
break
else:
# print(numpy.sin(numpy.array([deg])*numpy.pi/180)[0])
pass
deg = deg + 1
"""