Python|numpy学习总结
高效学习NumPy基础
- 创建数组
-
- numpy.array(object, dtype,copy, order, subox, ndmin)
- numpy.arange(start, stop, step, dtype)
- numpy.linspace(start, stop, num)
- numpy.logspase(start,stop,num)
- numpy.zeros(shape,dtype,order)
- numpy.eye(N,M, K,dtype,order)
- numpy.diag(V,K)
- numpy.ones(shape,dtype, order)
- 数组对象的属性
- 数组数据类型
-
- 基本数据类型
- 类型转换
- 创建数据类型
- 查看数据类型
- 自定义数组数据
- 生成随机数
-
- random模块的常用随机数生成函数
- 通过索引访问数组
-
- 一维数组的索引
- 多维数组的索引
- 使用整数函数和布尔值索引访问多维数组
- 变换数组的形态
-
- reshape()改变数组形状
- ravel()展平数组
- flatten()展平数组
- hstack()横向合并数组
- vstack()纵向合并数组
- concatenate()合并数组
- hsplit()横向分割数组
- vsplit()纵向分割数组
- split()分割数组
- 创建NumPy矩阵
-
- 矩阵创建
- 矩阵运算
- 矩阵属性
- ufunc函数
-
- 常用的函数
- 常用的ufunc函数运算
- 广播机制
- 文件操作
-
- 数据存储
- 文件读取
- txt格式保存与读取
- genfromtxt函数读取数据
- 排序
-
- sort函数 无返回值 直接对原始数据修改
- argsort函数
- lexsort函数
- 去重与生成重复数据
- 常用的统计函数
NumPy提供了两种基本对象:ndarray和ufunc,ndarray称为数组,而ufunc则是对数组进行处理的函数。
创建数组 numpy.array(object, dtype,copy, order, subox, ndmin) 【Python|numpy学习总结】用于创建NumPy数组
import numpy as np
"""
array(object, dtype=None, copy=True, order='K', subox=False, ndmin=0)
参数说明:object : 数组,公开数组接口的任何对象,__array__方法返回数组的对象,或任何(嵌套)序列。
dtype : 数据类型,数组所需的数据类型。如果没有给出,那么类型将被确定为保持序列中的对象所需的最小类型。此参数只能用于“upcast”数组。对于向下转换,请使用.astype(t)方法。copy : 如果为True(默认值),则复制对象。否则,只有当__array__返回副本,obj是嵌套序列,或者需要副本来满足任何其他要求(dtype,顺序等)时,才会进行复制。order : 英文字母,参数可写{'K','A','C','F'},指定阵列的内存布局。如果object不是数组,则新创建的数组将按C顺序排列(行主要),除非指定了'F',在这种情况下,它将采用Fortran顺序(专业列)。如果object是一个数组,则以下成立。当copy=False出于其他原因而复制时,结果copy=True与对A的一些例外情况相同,请参阅“注释”部分。默认顺序为“K”。subok : boolean值,如果为True,则子类将被传递,否则返回的数组将被强制为基类数组(默认)。ndmin : int值,指定结果数组应具有的最小维数。根据需要,将根据需要预先设置形状。满足要求的数组对象"""
# 创建一个数组 主要参数 object、dtype、ndmin。
a1 = np.array([1,2,3])
a2 = np.array([1,2,3], dtype=float)
a3 = np.array([1,2,3], ndmin=2)
print(a1)
print(a2)
print(a3)
运行结果:
[1 2 3][1. 2. 3.][[1 2 3]]
numpy.arange(start, stop, step, dtype) 在给定间隔内返回均匀间隔的值。左闭右开区间 [起始值,终止值)
import numpy as np
# 用array(range(10)) 生成0-9的的int类型数组
a1 = np.array(range(10))
"""
numpy.arange(start, stop, step, dtype=None)
参数说明:
start 起始值
stop 终止值 生成的范围到终止值-1 例如(0,10) 生成0~9
step 步长
dtype 数据类型
"""
# a1和a2的效果一样
a2 = np.arange(10)
a3 = np.arange(0, 10)
a4 = np.arange(0, 10, 2)
a5 = np.arange(0, 10, 2, float)
print(a1)
print(a2)
print(a3)
print(a4)
print(a5)
运行结果:
[0 1 2 3 4 5 6 7 8 9][0 1 2 3 4 5 6 7 8 9][0 1 2 3 4 5 6 7 8 9][0 2 4 6 8][0. 2. 4. 6. 8.]
numpy.linspace(start, stop, num) 用于返回间隔类均匀分布的数值序列。闭区间 [起始值,终止值]
import numpy as np
"""
numpy.linspace(start, stop, num)
参数说明:
start 起始值
stop 终止值
num 数量 默认值为50
"""
a1 = np.linspace(0,10)
a2 = np.linspace(0,10, 5)
print(a1)
print(a2)
运行结果:
[ 0.0.204081630.408163270.61224490.816326531.02040816
1.22448981.428571431.632653061.836734692.040816332.24489796
2.448979592.653061222.857142863.061224493.265306123.46938776
3.673469393.877551024.081632654.285714294.489795924.69387755
4.897959185.102040825.306122455.510204085.714285715.91836735
6.122448986.326530616.530612246.734693886.938775517.14285714
7.346938787.551020417.755102047.959183678.163265318.36734694
8.571428578.77551028.979591849.183673479.38775519.59183673
9.79591837 10.][ 0.2.55.7.5 10. ]
numpy.logspase(start,stop,num) 用于返回间隔类均匀分布的等比数列。闭区间 [起始值,终止值]
"""
numpy.logspace(start, stop, num)
参数说明:
start 起始值
stop 终止值
num 数量 默认值为50
"""
a1 = np.logspace(0,2)
a2 = np.logspace(0,2, 5)
print(a1)
print(a2)
运行结果:
[1.1.098541141.206792641.325711371.45634848
1.599858721.757510621.930697732.120950892.32995181
2.559547922.81176873.08884363.393221773.72759372
4.094915064.498432674.941713365.428675445.96362332
6.551285577.196856737.906043218.685113749.54095476
10.4811313411.5139539912.6485521713.8949549415.26417967
16.7683293718.4206996920.2358964822.2299648324.42053095
26.8269579529.4705170332.3745754335.5648030639.06939937
42.919342647.1486636351.7947467956.8986602962.50551925
68.664884575.4312006382.8642772991.0298178100.][1.3.1622776610.31.6227766100.]
numpy.zeros(shape,dtype,order) 用于创建值全部为0的数组,即创建的数组元素全部为0
"""
numpy.zeros(shape, dtype, order)
参数说明:
shape 数组的维度
dtype 数据类型
order 指定阵列的内存布局
"""
a1 = np.zeros((5,5), dtype=int)
a2 = np.zeros((5,5), dtype=float)
print(a1)
print(a2)
运行结果:
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
numpy.eye(N,M, K,dtype,order) 用于生成主对角线为1,其余元素为0的数组
"""
numpy.eye(N,M, K,dtype,order)
参数说明:
N 数组的行数
M 数组的列数 不写默认为N
K 对角线的索引:0(默认值)指的是主对角线,正值指的是上对角线,负值指的是下对角线。
dtype 数据类型
order 指定阵列的内存布局
"""
a1 = np.eye(5, dtype=int)
a2 = np.eye(2, 3, dtype=int)
a3 = np.eye(5, 5, 0, dtype=int)
a4 = np.eye(5, 5, 1, dtype=int)
a5 = np.eye(5, 5, -1, dtype=int)
print(a1)
print(a2)
print(a3)
print(a4)
print(a5)
运行结果:
[[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]]
[[1 0 0]
[0 1 0]]
[[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]]
[[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]
[0 0 0 0 0]]
[[0 0 0 0 0]
[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]]
numpy.diag(V,K) 除了对角线以外的其他元素为0, 对角线上的元素可以是0或其他值
"""
numpy.diag(V, K)
参数说明:
V如果是2D数组,返回k位置的对角线。
如果是1D数组,返回一个v作为k位置对角线的2维数组。
K对角线的位置,大于零位于对角线上面,小于零则在下面。
"""
a1 = np.diag([1,2,3,4])
a2 = np.diag([1,2,3,4,5], 0)
a3 = np.diag([1,2,3,4,5], 1)
a4 = np.diag([1,2,3,4,5], -1)
print(a1)
print(a2)
print(a3)
print(a4)
运行结果:
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
[[1 0 0 0 0]
[0 2 0 0 0]
[0 0 3 0 0]
[0 0 0 4 0]
[0 0 0 0 5]]
[[0 1 0 0 0 0]
[0 0 2 0 0 0]
[0 0 0 3 0 0]
[0 0 0 0 4 0]
[0 0 0 0 0 5]
[0 0 0 0 0 0]]
[[0 0 0 0 0 0]
[1 0 0 0 0 0]
[0 2 0 0 0 0]
[0 0 3 0 0 0]
[0 0 0 4 0 0]
[0 0 0 0 5 0]]
numpy.ones(shape,dtype, order) 用于创建元素全部为1的数组
"""
numpy.ones(shape, dtype, order)
参数说明:
shape 数组的维度
dtype 数据类型
order 指定阵列的内存布局
"""
a1 = np.ones((3,4), dtype=int)
a2 = np.ones((4,4), dtype=float)
print(a1)
print(a2)
运行结果:
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
数组对象的属性
属性 | 说明 |
---|---|
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 | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。 |
import numpy as np
"""
数组对象的属性
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 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。
"""
a1 = np.array([[1,2,3], [4,5,6], [7,8,9]])
print("ndim:", a1.ndim)
print("shape:", a1.shape)
print("size:", a1.size)
print("dtype:", a1.dtype)
print("itemsize:", a1.itemsize)
"""
C_CONTIGUOUS (C) 数据是在一个单一的C风格的连续段中
F_CONTIGUOUS (F) 数据是在一个单一的Fortran风格的连续段中
OWNDATA (O) 数组拥有它所使用的内存或从另一个对象中借用它
WRITEABLE (W) 数据区域可以被写入,将该值设置为 False,则数据为只读
ALIGNED (A) 数据和所有元素都适当地对齐到硬件上
UPDATEIFCOPY (U) 这个数组是其它数组的一个副本,当这个数组被释放时,原数组的内容将被更新
"""
print("flags:", a1.flags)
print("real:", a1.real)
print("imag:", a1.imag)
print("data:", a1.data)
运行结果:
ndim: 2
shape: (3, 3)
size: 9
dtype: int32
itemsize: 4
flags:C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : Falsereal: [[1 2 3]
[4 5 6]
[7 8 9]]
imag: [[0 0 0]
[0 0 0]
[0 0 0]]
data:
数组数据类型 基本数据类型 转载至https://www.cnblogs.com/mengxiaoleng/p/11616270.html
文章图片
文章图片
类型转换 语法:numpy.数据类型(object)
# 整型转换为浮点型
print("整型转换为浮点型:", np.float64(66))
# 浮点型转换为整型
print("浮点型转换为整型:", np.int8(66.66))
# 整型转换为布尔型 0为False 其他数为True
print("整型转换为布尔型:", np.bool(0))
# 布尔型转浮点型 True为1.0 False为0.0
print("布尔型转浮点型:", np.float64(True))
"""
运行结果:
整型转换为浮点型: 66.0
浮点型转换为整型: 66
整型转换为布尔型: False
布尔型转浮点型: 1.0
"""
创建数据类型 语法:numpy.dtype([(name, dtype, [size]),(name, dtype)…])
"""
创建一个数据类型,存储图书信息
需求:
1.能存储50个字符的字符串记录书名
2.用一个64位的整数记录库存
3.用一个64位的单精度浮点数 记录价格
"""
book_type = np.dtype([("name", np.str_, 50), ("count", np.int64), ("price", np.float64)])
print("数据类型为:", book_type)
运行结果:
数据类型为: [('name', '
查看数据类型 语法:直接当作字典访问或numpy.dtype()
# 直接访问
print("图书名字的数据类型:", book_type["name"])
# numpy.dtype()
print("图书数量的数据类型:", np.dtype(book_type["count"]))
运行结果:
图书名字的数据类型:
自定义数组数据 在使用array函数创建数组时,自定义数组数据,可以预先自定数据类型,而默认是浮点型。
items = np.array([("华为应用开发中级", 88, 79.00), ("Python语言程序设计", 50, 49.80)], dtype=book_type)
print("自定义数据为:", items)
运行结果:
自定义数据为: [('华为应用开发中级', 88, 79. ) ('Python语言程序设计', 50, 49.8)]
生成随机数
# rand函数生成的均匀分布的随机数 参数:size
a1 = np.random.rand(1, 2)
a2 = np.random.rand(1, 2, 3, 4)
print("rand函数生成的均匀分布的随机数:")
print(a1)
print(a2)
print("-"*50)# randn函数生成具有标准正态分布的随机数 参数:size
a3 = np.random.randn(1, 2)
a4 = np.random.randn(1, 2, 3, 4)
print("randn函数生成具有标准正态分布的随机数:")
print(a3)
print(a4)
print("-"*50)# randint函数生成[low, high)区间的随机整数 参数:low, high, size, dtype
a5 = np.random.randint(1, 10, [1, 2], dtype="short")
a6 = np.random.randint(1, 10, [1, 2, 3], dtype="long")
print("randint函数生成[low, high)区间的随机整数:")
print(a5, a5.dtype)
print(a6, a6.dtype)
print("-"*50)# random_sample函数生成随机浮点数,在半开区间 [0.0, 1.0) 参数: size
a7 = np.random.random_sample([1, 2])
a8 = np.random.random_sample([1, 2, 3])
print("random_sample函数生成随机浮点数:")
print(a7)
print(a8)
运行结果:
rand函数生成的均匀分布的随机数:
[[0.37825834 0.36723038]][[[[0.71418784 0.73996675 0.15419813 0.99419331]
[0.58614779 0.73066644 0.49114029 0.80010252]
[0.33072697 0.48593358 0.73750939 0.6098291 ]][[0.18201681 0.34509901 0.07229337 0.89061953]
[0.41669819 0.59503481 0.73802839 0.40802414]
[0.1855280.73147802 0.46253263 0.25485796]]]]
--------------------------------------------------
randn函数生成具有标准正态分布的随机数:
[[1.01330053 0.59629841]][[[[-1.23013022 -0.54980997 -0.86341347 -0.14536862]
[-0.54584678 -0.22382106 -1.710410330.91828566]
[-0.2115877-0.530026940.04532693 -0.7821888 ]][[-0.39234029 -0.82818071 -0.065661150.63458322]
[ 0.51276787 -2.080871580.470106581.85817864]
[ 1.099097450.24666559 -0.72258201 -0.64547011]]]]
--------------------------------------------------
randint函数生成[low, high)区间的随机整数:
[[5 6]] int16
[[[5 2 1]
[9 1 9]]] int32
--------------------------------------------------
random_sample函数生成随机浮点数:
[[0.97716236 0.89218794]][[[0.53794987 0.11502953 0.32427659]
[0.51851268 0.6310960.49160983]]]
random模块的常用随机数生成函数
函数 | 说明 |
---|---|
seed | 确定随机数生成种子 |
permutation | 返回一个序列的随机排列或返回一个随机排列的范围 |
shuffle | 对一个序列进行随机排序 |
binomial | 生成二项分布的随机数 |
normal | 生成正态(高斯)分布的随机数 |
beta | 生成beta分布的随机数 |
chisquare | 生成卡方分布的随机数 |
gamma | 生成gamma分布的随机数 |
uniform | 生成在[0,1]中均匀分布的随机数 |
# 定义数组
a = np.arange(10)# 获取某个元素
print("获取某个元素:", a[3])# 切片(跟列表切片是一样的)
print("取前五个元素:", a[:6], a[:-4], a[0: 6])# 设置步长 取 1 3 5 7
print("设置步长:", a[1: 8: 2])# 反向设置步长 取7 5 3 1
print("反向设置步长", a[7: 0: -2])
运行结果:
获取某个元素: 3
取前五个元素: [0 1 2 3 4 5] [0 1 2 3 4 5] [0 1 2 3 4 5]
设置步长: [1 3 5 7]
反向设置步长 [7 5 3 1]
多维数组的索引
# 定义多维数组
a = np.array([[1,2,3,4,5], [4,5,6,7,8], [7,8,9,10,11]])# 取第1行第2 3个 注意下标都是从0开始的 即第2行的第3 4个
print("取第1行第2 3个:", a[1, 2: 4])# 取第0和1行 第1~4列的元素 即取第一第二行的第二个元素到最后一个元素
print("取第0和1行 第2~5列的元素:", a[:2, 1:])# 取所有行的第3列
print("取所有行的第3列", a[:, 2])
运行结果:
取第1行第2 3个: [6 7]取第0和1行 第2~5列的元素: [[2 3 4 5]
[5 6 7 8]]
取所有行的第3列 [3 6 9]
使用整数函数和布尔值索引访问多维数组
# 定义多维数组
a = np.array([[1,2,3,4,5], [4,5,6,7,8], [7,8,9,10,11]])# 从两个序列的对应位置去除两个整数来组成下标 [0,1] [2,2] [2,3]
print("索引结果为:", a[(0,2,2), (1,2,3)])# 取第一第二行的0,1,2列元素
print("取第一第二行的0,1,2列元素:", a[1:, (0, 1 ,2)])# 生成一个布尔数组
bools = np.array([0, 1, 1], dtype=np.bool)# 取第一第二行的4列元素
print("取第一第二行的4列元素:", a[bools, 3])
运行结果:
索引结果为: [ 29 10]取第一第二行的0,1,2列元素: [[4 5 6]
[7 8 9]]
取第一第二行的3,4列元素: [ 7 10]
变换数组的形态 reshape()改变数组形状
# 创建一个数组
a1 = np.arange(12)
print("原数据:", a1, a1.shape)# 改变数组的形状 (不改变原对象, 生成新的对象需要接收返回值)
a2 = a1.reshape(3, 4)
print("改变数组的形状:", a2, a2.shape)
运行结果:
原数据: [ 0123456789 10 11] (12,)改变数组的形状: [[ 0123]
[ 4567]
[ 89 10 11]] (3, 4)
ravel()展平数组
# 创建一个数组
a1 = np.arange(12)
print("原数据:", a1, a1.shape)# 改变数组的形状 (不改变原对象, 生成新的对象需要接收返回值)
a2 = a1.reshape(3, 4)
print("改变数组的形状:", a2, a2.shape)# ravel函数展平数组 (改变原对象, 不需要接收返回值)
a1.ravel()
print("ravel函数展平数组后:", a1, a1.shape)
运行结果:
原数据: [ 0123456789 10 11] (12,)改变数组的形状: [[ 0123]
[ 4567]
[ 89 10 11]] (3, 4)
ravel函数展平数组: [ 0123456789 10 11] (12,)
flatten()展平数组
# 创建一个shape为(3, 4)的数组
a1 = np.arange(12).reshape(3, 4)
print("原数据:", a, a.shape)# flatten函数展平数组a2 = a1.flatten() # 横向展平
print("横向展平:", a2, a2.shape)a3 = a1.flatten('F') # 纵向展平
print("纵向展平:", a3, a3.shape)
运行结果:
原数据: [[ 0123]
[ 4567]
[ 89 10 11]] (3, 4)
横向展平: [ 0123456789 10 11] (12,)纵向展平: [ 04815926 1037 11] (12,)
hstack()横向合并数组
# 创建两个数组
a1 = np.arange(12).reshape(3, 4)
a2 = a1 * 2
print("数组1:", a1, a1.shape)
print("数组2:", a2, a2.shape)# hstack横向合并
print("hstack横向合并:", np.hstack((a1, a2)))
运行结果:
数组1: [[ 0123]
[ 4567]
[ 89 10 11]] (3, 4)
数组2: [[ 0246]
[ 8 10 12 14]
[16 18 20 22]] (3, 4)
hstack横向合并: [[ 01230246]
[ 45678 10 12 14]
[ 89 10 11 16 18 20 22]]
vstack()纵向合并数组
# 创建两个数组
a1 = np.arange(12).reshape(3, 4)
a2 = a1 * 2
print("数组1:", a1, a1.shape)
print("数组2:", a2, a2.shape)# vstack纵向合并
print("vstack纵向合并:", np.vstack((a1, a2)))
运行结果:
数组1: [[ 0123]
[ 4567]
[ 89 10 11]] (3, 4)
数组2: [[ 0246]
[ 8 10 12 14]
[16 18 20 22]] (3, 4)
vstack纵向合并: [[ 0123]
[ 4567]
[ 89 10 11]
[ 0246]
[ 8 10 12 14]
[16 18 20 22]]
concatenate()合并数组
# 创建两个数组
a1 = np.arange(12).reshape(3, 4)
a2 = a1 * 2
print("数组1:", a1, a1.shape)
print("数组2:", a2, a2.shape)# concatenate横向合并 (axis默认为0)
print("concatenate纵向合并:", np.concatenate((a1, a2), axis=0))# concatenate横向合并
print("concatenate横向合并:", np.concatenate((a1, a2), axis=1))
运行结果:
数组1: [[ 0123]
[ 4567]
[ 89 10 11]] (3, 4)
数组2: [[ 0246]
[ 8 10 12 14]
[16 18 20 22]] (3, 4)
concatenate纵向合并: [[ 0123]
[ 4567]
[ 89 10 11]
[ 0246]
[ 8 10 12 14]
[16 18 20 22]]
concatenate横向合并: [[ 01230246]
[ 45678 10 12 14]
[ 89 10 11 16 18 20 22]]
hsplit()横向分割数组
# 创建一个数组
a = np.arange(16).reshape(4, 4)
print("原数组:", a, a.shape)# 横向分割
print("横向分割:", np.hsplit(a, 2))
运行结果:
原数组: [[ 0123]
[ 4567]
[ 89 10 11]
[12 13 14 15]] (4, 4)
横向分割: [array([[ 0,1],
[ 4,5],
[ 8,9],
[12, 13]]), array([[ 2,3],
[ 6,7],
[10, 11],
[14, 15]])]
vsplit()纵向分割数组
# 创建一个数组
a = np.arange(16).reshape(4, 4)
print("原数组:", a, a.shape)# 纵向分割
print("纵向分割:", np.vsplit(a, 2))
运行结果:
原数组: [[ 0123]
[ 4567]
[ 89 10 11]
[12 13 14 15]] (4, 4)
纵向分割: [array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8,9, 10, 11],
[12, 13, 14, 15]])]
split()分割数组
# 创建一个数组
a = np.arange(16).reshape(4, 4)
print("原数组:", a, a.shape)# 纵向分割 (axis默认为0)
print("纵向分割:", np.split(a, 2, axis=0))# 横向分割
print("横向分割:", np.split(a, 2, axis=1))
运行结果:
原数组: [[ 0123]
[ 4567]
[ 89 10 11]
[12 13 14 15]] (4, 4)
纵向分割: [array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8,9, 10, 11],
[12, 13, 14, 15]])]横向分割: [array([[ 0,1],
[ 4,5],
[ 8,9],
[12, 13]]), array([[ 2,3],
[ 6,7],
[10, 11],
[14, 15]])]
创建NumPy矩阵 矩阵创建
# mat创建矩阵 使用分号分隔数据
m1 = np.mat("1 2 3;
4 5 6;
7 8 9")
print(m1, m1.shape)# matrix创建矩阵
m2 = np.matrix([[1,2,3], [4,5,6], [7,8,9]])
print(m2, m2.shape)# 创建一个全为0和一个全为1的数组
a1 = np.zeros([3, 3])
a2 = np.ones([3, 3])# # bmat将多个小矩阵(数组)合并成一个大矩阵
print("bmat将多个小矩阵合并成一个大矩阵:\n", np.bmat("a1 a2;
a2 a1"))
运行结果:
[[1 2 3]
[4 5 6]
[7 8 9]] (3, 3)
[[1 2 3]
[4 5 6]
[7 8 9]] (3, 3)
bmat将多个小矩阵合并成一个大矩阵:
[[0. 0. 0. 1. 1. 1.]
[0. 0. 0. 1. 1. 1.]
[0. 0. 0. 1. 1. 1.]
[1. 1. 1. 0. 0. 0.]
[1. 1. 1. 0. 0. 0.]
[1. 1. 1. 0. 0. 0.]]
矩阵运算
# 创建两个矩阵
m1 = np.mat("1 2 3;
4 5 6;
7 8 9")
m2 = m1 * 2
print("矩阵1:", m1, m1.shape)
print("矩阵2:", m2, m2.shape)
# 矩阵相加
print("矩阵相加:", m1 + m2)
# 矩阵相减
print("矩阵相减:", m1 - m2)
# 矩阵相除
print("矩阵相除:",(m2+1) / (m1+1))
# 矩阵相乘
print("矩阵相乘:", m1 * m2)
print("矩阵相乘:", np.multiply(m1, m2))
运行结果:
矩阵1: [[1 2 3]
[4 5 6]
[7 8 9]] (3, 3)
矩阵2: [[ 246]
[ 8 10 12]
[14 16 18]] (3, 3)
矩阵相加: [[ 369]
[12 15 18]
[21 24 27]]
矩阵相减: [[-1 -2 -3]
[-4 -5 -6]
[-7 -8 -9]]
矩阵相除: [[1.51.66666667 1.75]
[1.81.83333333 1.85714286]
[1.8751.88888889 1.9]]
矩阵相乘: [[ 607284]
[132 162 192]
[204 252 300]]
矩阵相乘: [[2818]
[ 325072]
[ 98 128 162]]
矩阵属性
属性 | 说明 |
---|---|
T | 返回自身的转置 |
H | 返回自身的共轭转置 |
I | 返回自身的逆矩阵 |
A | 返回自身数据的二维数组的一个视图(没做任何复制) |
# 创建矩阵
m = np.mat("1 2 3;
4 5 6;
7 8 9")# 转置
print("转置:", m.T)# 共轭转置
print("共轭转置:", m.H)# 逆矩阵
print("逆矩阵:", m.I)# 二维数组的视图
print("二维数组的视图:", m.A)
运行结果:
转置: [[1 4 7]
[2 5 8]
[3 6 9]]
共轭转置: [[1 4 7]
[2 5 8]
[3 6 9]]
逆矩阵: [[-4.50359963e+159.00719925e+15 -4.50359963e+15]
[ 9.00719925e+15 -1.80143985e+169.00719925e+15]
[-4.50359963e+159.00719925e+15 -4.50359963e+15]]
二维数组的视图: [[1 2 3]
[4 5 6]
[7 8 9]]
ufunc函数 常用的函数 大多数ufunc函数都是用C语言实现的,因此ufunc函数比math库中的函数效率高。
函数 | 使用方法 |
---|---|
sqrt() | 计算序列化数据的平方根 |
sin()、cos() | 三角函数 |
abs() | 计算序列化数据的绝对值 |
dot() | 矩阵运算 |
log()、logl()、log2() | 对数函数 |
exp() | 指数函数 |
cumsum()、cumproduct() | 累计求和、求积 |
sum() | 对一个序列化数据进行求和 |
mean() | 计算均值 |
median() | 计算中位数 |
std() | 计算标准差 |
var() | 计算方差 |
corrcoef() | 计算相关系数 |
# 创建两个数组
a = np.array([1, 2, 3])
b = np.array([2, 4, 6])
# 四则运算
print("数组相加:", a + b)
print("数组相减:", a - b)
print("数组相乘:", a * b)
print("数组相除:", a / b)
print("数组幂运算:", a ** b)# 比较运算
print("比较结果:", a < b)
print("比较结果:", a > b)
print("比较结果:", a == b)
print("比较结果:", a <= b)
print("比较结果:", a >= b)
print("比较结果:", a != b)
运行结果:
数组相加: [3 6 9]
数组相减: [-1 -2 -3]
数组相乘: [ 28 18]
数组相除: [0.5 0.5 0.5]
数组幂运算: [116 729]
比较结果: [ TrueTrueTrue]
比较结果: [False False False]
比较结果: [False False False]
比较结果: [ TrueTrueTrue]
比较结果: [False False False]
比较结果: [ TrueTrueTrue]
广播机制
- ufunc通用函数,能够对array中所有元素进行操作的函数
- Broadcasting指对不同形状的array之间执行算术运算的方式
- 不同形状的数组运算时,Numpy则会执行广播机制
- numpy能够运用向量化运算处理整个数组,所以速度比较快
# 创建数组
a = np.arange(100).reshape(10, 10)
b = a * 2# 二进制数据保存 np.save(file, arr, allow_pickle=True, fix_imports=True)
np.save("save01", a)# 多个数组保存
np.savez("save02", a, b)
运行结果:
文章图片
文件读取
# 读取单个数组
a = np.load("save01.npy")
print("读取单个数组", a)# 读取多个数组
data = https://www.it610.com/article/np.load("save02.npz")
# arr_下标 固定格式
print("a:", data['arr_0'])
print("b:", data['arr_1'])
运行结果:
读取单个数组 [[ 0123456789]
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 23 24 25 26 27 28 29]
[30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]
[50 51 52 53 54 55 56 57 58 59]
[60 61 62 63 64 65 66 67 68 69]
[70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89]
[90 91 92 93 94 95 96 97 98 99]]
a: [[ 0123456789]
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 23 24 25 26 27 28 29]
[30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]
[50 51 52 53 54 55 56 57 58 59]
[60 61 62 63 64 65 66 67 68 69]
[70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89]
[90 91 92 93 94 95 96 97 98 99]]
b: [[024681012141618]
[ 20222426283032343638]
[ 40424446485052545658]
[ 60626466687072747678]
[ 80828486889092949698]
[100 102 104 106 108 110 112 114 116 118]
[120 122 124 126 128 130 132 134 136 138]
[140 142 144 146 148 150 152 154 156 158]
[160 162 164 166 168 170 172 174 176 178]
[180 182 184 186 188 190 192 194 196 198]]
txt格式保存与读取
# 创建数组
a = np.arange(16).reshape(4, 4)# txt格式数据保存 np.savetxt(file, arr, fmt="%.18e", delimiter=" ", newline="\n", header="", footer="", comments="# ")
np.savetxt("save03.txt", a, fmt="%d", delimiter=",", newline="\n")# 读取txt文件
data = https://www.it610.com/article/np.loadtxt("save03.txt", delimiter=",")
print(data)
运行结果:
文章图片
[[ 0.1.2.3.]
[ 4.5.6.7.]
[ 8.9. 10. 11.]
[12. 13. 14. 15.]]
genfromtxt函数读取数据 genfromtxt函数和loadtxt函数相似,genfromtxt函数是面向结构化和缺失数据。通常使用的三个参数,fname文件路径,delimiter分隔符,names列标题
# 使用genfromtxt函数读取数据
data = https://www.it610.com/article/np.genfromtxt("save03.txt", delimiter=",")
print(data)
运行结果:
[[ 0.1.2.3.]
[ 4.5.6.7.]
[ 8.9. 10. 11.]
[12. 13. 14. 15.]]
排序 sort函数 无返回值 直接对原始数据修改
# 设置随机数种子
np.random.seed(11)
# 随机生成一维数组
a = np.random.randint(1, 10, size=10)
print("排序前:", a)
a.sort()
print("排序后:", a)# 随机生成二维数组
b = np.random.randint(1, 10, size=(3, 3))# 纵向排序
b.sort(axis=0)
print("纵向排序", b)# 横向排序
b.sort(axis=1)
print("横向排序", b)
运行结果:
排序前: [1 2 8 2 8 3 9 1 1 5]排序后: [1 1 1 2 2 3 5 8 8 9]纵向排序 [[2 2 5]
[3 8 6]
[6 9 9]]
横向排序 [[2 2 5]
[3 6 8]
[6 9 9]]
argsort函数
# 随机生成一维数组
a = np.random.randint(1, 10, size=10)
print("排序前:", a)
# 返回值为重新排序后,原值的下标
print("排序后返回下标:", a.argsort())
运行结果:
排序前: [4 2 1 4 9 8 2 5 9 3]
排序后返回下标: [2 1 6 9 0 3 7 5 4 8]
lexsort函数
# 创建三个数组
a = np.array([5, 7, 8, 2])
b = np.array([30, 50, 20, 80])
c = np.array([900, 400, 600, 200])# 进行lexsort排序 只接收一个参数
d = np.lexsort((a, b , c))# 多个键值排序时,按照最后一个传入的数据排序
print("排序后返回下标:", d)
print("排序后的数组为:", list(zip(a[d], b[d], c[d])))
运行结果:
排序后返回下标: [3 1 2 0]
排序后的数组为: [(2, 80, 200), (7, 50, 400), (8, 20, 600), (5, 30, 900)]
去重与生成重复数据
# 随机生成一维数组
a = np.random.randint(1, 5, size=10)
print("一维数组a:", a)# 去重
print("去重后:", np.unique(a))# 生成[0, 1, 2, 3, 4]
b = np.arange(5)# np.tile(arr, times)
print("使用tile函数对b重复3次后:", np.tile(b, 3))# 创建一个二维数组
c = np.random.randint(0, 10, size=(2, 3))
print("二维数组c:", c)# np.repeat(arr, times, axis=None)
print("纵向重复数据:", np.repeat(c, 2, axis=0))
print("横向重复数据:", np.repeat(c, 2, axis=1))
运行结果:
一维数组a: [3 2 4 2 3 1 4 2 2 3]去重后: [1 2 3 4]使用tile函数对b重复3次后: [0 1 2 3 4 0 1 2 3 4 0 1 2 3 4]二维数组c: [[6 9 1]
[1 6 5]]
纵向重复数据: [[6 9 1]
[6 9 1]
[1 6 5]
[1 6 5]]
横向重复数据: [[6 6 9 9 1 1]
[1 1 6 6 5 5]]
常用的统计函数
a = np.arange(1,17).reshape(4, 4)
print("数组a:", a)
print("求和:", np.sum(a))
print("纵向求和:", np.sum(a, axis=0))
print("横向求和:", np.sum(a, axis=1))
print("平均值", np.mean(a))
print("纵向平均值:", np.mean(a, axis=0))
print("横向平均值:", np.mean(a, axis=1))
print("标准差:", np.std(a))
print("方差:", np.var(a))
print("最大值:", np.max(a))
print("最小值:", np.min(a))
print("最小索引", np.argmin(a))
print("最大索引", np.argmax(a))
print("计算索引元素的累计和:", np.cumsum(a))
print("计算索引元素的累计积:", np.cumprod(a))
运行结果:
数组a: [[ 1234]
[ 5678]
[ 9 10 11 12]
[13 14 15 16]]
求和: 136
纵向求和: [28 32 36 40]
横向求和: [10 26 42 58]
平均值 8.5
纵向平均值: [ 7.8.9. 10.]
横向平均值: [ 2.56.5 10.5 14.5]
标准差: 4.6097722286464435
方差: 21.25
最大值: 16
最小值: 1
最小索引 0
最大索引 15
计算索引元素的累计和: [13610152128364555667891 105 120 136]
计算索引元素的累计积: [12624120720
504040320362880362880039916800479001600
1932053504 1278945280 2004310016 2004189184]
恭喜你已经掌握了NumPy的精髓~
文章图片
码字不易,请给博主一个小小的赞吧~
推荐阅读
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- 一起来学习C语言的字符串转换函数
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期