Numpy基础
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引(以下数组皆为ndarray类型,而非list类型)
1.ndarray的属性
ndarray 对象是用于存放同类型元素的多维数组
属性 | 作用 |
---|---|
ndim | 返回int,表示数组的维数 |
shape | 返回tuple。表述数组的尺寸,对于n行m列的矩阵,形状为(n,m) |
size | 返回int,表示数组的元素总数,等于数组形状的乘积 |
dtype | 返回data-type,描述数组中元素的类型 |
itemsize | 返回int,表示数组的每个元素的大小(以字节为单位) |
import numpy as np
a=np.array([[1,2,3],[1,2,4]],dtype=np.float32)
#数组元素总数
print(a.size) #输出结果:6
# 数组的形状,多少行多少列
print(a.shape) #输出结果:(2,3)
# 数组的维数
print(a.ndim) #输出结果:2
# 数组中元素类型
print(a.dtype) #输出结果:float32
2.修改ndarray的固有属性
2.1 改变数组维度
import numpy as np
a=np.array([[1,2,3],[1,2,4]],dtype=np.float32)
# 修改数组形状
print(a.reshape(3,2))
'''
输出结果为:
[[1. 2.]
[3. 1.]
[2. 4.]]
'''
3.生成特殊数组
生成的所有数组都为ndarray类型,可构造数组:
- 顺序数组
- 等差数组
- 等比数组
- 全零多维数组
- 单位多维数组
- 对角线多维数组
import numpy as np
#生成顺序数组
print(np.arange(10)) # 输出结果:[0 1 2 3 4 5 6 7 8 9]
#创建等差数组
print(np.linspace(0,10,10)) #输出结果:[ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556 6.66666667 7.77777778 8.88888889 10. ]
# 创建不包含结尾数字的等差数组
print(np.linspace(0,10,10,endpoint=False)) # 输出结果:[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
# 创建等比数列
print(np.logspace(0,10,10,endpoint=False,base=2)) # 输出结果:[1. 2. 4. 8. 16. 32. 64. 128. 256. 512.]
# 生成全0数组
print(np.zeros(2)) # 输出结果:[0. 0.]
# 生成两行三列的全0数组
print(np.zeros((2,3)))
'''
输出结果为:
[[0. 0. 0.]
[0. 0. 0.]]
'''
# 生成3阶单位数组
print(np.eye(3))
'''
输出结果为:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
'''
# 生成元素值全为1的数组
print(np.ones(2)) # 输出结果:[1. 1.]
# 生成元素值全为1的数组
print(np.ones((2,3)))
'''
输出结果为:
[[1. 1. 1.]
[1. 1. 1.]]
'''
#生成指定对角线元素值的数组
print(np.diag([1,3,7]))
'''
输出结果为:
[[1 0 0]
[0 3 0]
[0 0 7]]
'''
4.生成随机数数组
生成的所有数组都为ndarray类型,可生成随机数数组:
- 0-1之间的随机数一维数组
- 0-1之间的随机数多维数组
- 均匀分布的随机数多维数组
- 正态分布的随机数多维数组
- 0-10之间的随机数多维数组
import numpy as np
# 生成4个0-1之间的随机数数组
print(np.random.random(size=4)) #输出结果:[0.71768555 0.5947797 0.79972761 0.50824454]
# 生成0-1之间的随机数矩阵
print(np.random.random(size=(2,3)))
'''
输出结果为:
[[0.32749832 0.04388334 0.56163757]
[0.4309314 0.0344187 0.34532551]]
'''
# 生成4个均匀分布的随机数矩阵
print(np.random.rand(2,3,2))
'''
输出结果为:
[[[0.66295917 0.70471342]
[0.05790362 0.49323016]
[0.10871097 0.64858176]]
[[0.07858738 0.63434474]
[0.537959 0.01110871]
[0.53534531 0.15553675]]]
'''
# 生成正态分布的随机数矩阵
print(np.random.randn(2,3,2))
'''
输出结果为:
[[[-1.31108764 0.09089742]
[-0.17214132 -0.41071538]
[-0.06360873 0.65520704]]
[[-0.08087163 1.73616904]
[ 2.27342071 -0.23829859]
[ 0.73271656 1.0389563 ]]]
'''
# 随机生成0-10之间的2行3列随机数矩阵
print(np.random.randint(0,10,size=(2,3)))
'''
输出结果为:
[[2 6 5]
[5 6 1]]
'''
5.索引与切片
5.1 一维的索引
import numpy as np
# 一维数组的索引
a=np.arange(10) #a=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 数组的第三个值
print(a[2]) #输出结果:2
#数组从第三个值之后的值
print(a[2:]) #输出结果:[2 3 4 5 6 7 8 9]
#数组第六个值之前的值
print(a[:5]) #输出结果:[0 1 2 3 4]
#数组从第二个值到最后一个值
print(a[1:-1]) #输出结果:[1 2 3 4 5 6 7 8]
#数组从第二个值到最后一个值,其间步长为2
print(a[1:-1:2]) #输出结果:[1 3 5 7]
5.2 多维的索引
前为行,后为列,然后各自看切片
import numpy as np
# 多维数组的索引
b=np.random.randint(0,10,size=(2,3))
'''
输出结果为:
[[4 6 7]
[8 2 4]]
'''
# 输出第二行所有元素
print(b[1,:]) #输出结果:[8 2 4]
#输出第一列所有元素
print(b[:,0]) #输出结果:[4 8]
#行上全取,列上使用步长为2进行取
print(b[:,::2])
'''
输出结果为:
[[4 7]
[8 4]]
'''
6.降维
import numpy as np
# 多维数组的索引
b=np.random.randint(0,10,size=(2,3)) #输出结果:[[2 8 5] [6 6 3]]
# 展开多维数组变为一维数组
print(b.ravel()) #输出结果:[2 8 5 6 6 3]
7.矩阵化
7.1 矩阵化的方式
import numpy as np
#创建矩阵
print(np.mat([[1,2],[3,4]]))
'''
输出为:
[[1 2]
[3 4]]
'''
#创建矩阵
print(np.matrix([[11,21],[31,41]]))
'''
输出为:
[[11 21]
[31 41]]
'''
7.2 矩阵拼接
import numpy as np
a=np.mat([[1,2],[3,4]])
'''
输出为:
[[1 2]
[3 4]]
'''
b=np.matrix([[11,21],[31,41]])
'''
输出为:
[[11 21]
[31 41]]
'''
#横向合成矩阵
print(np.bmat('a b'))
'''
输出为:
[[ 1 2 11 21]
[ 3 4 31 41]]
'''
7.3 矩阵乘法
import numpy as np
a=[[1,2],[3,4]]
'''
输出为:
[[1 2]
[3 4]]
'''
b=[[1,1],[1,1]]
'''
输出为:
[[1 1]
[1 1]]
'''
#作为矩阵相乘法一
print(np.array(a).dot(np.array(b)))
#作为矩阵相乘法二
print(np.matrix(a)*np.matrix(b))
'''
输出为:
[[3 3]
[7 7]]
'''
7.4 矩阵转置
import numpy as np
a=np.mat([[1,1],[3,4]])
'''
输出为:
[[1 1]
[3 4]]
'''
#使用矩阵内置算法求逆
print(a.T)
'''
输出为:
[[1 3]
[2 4]]
'''
8.拼接
8.1 横向拼接
import numpy as np
#拼接数组
a=np.arange(10).reshape(2,5)
'''
输出结果为
[[0 1 2 3 4]
[5 6 7 8 9]]
'''
b=np.linspace(0,1,endpoint=False,num=10).reshape(2,5)
'''
输出结果为
[[0. 0.1 0.2 0.3 0.4]
[0.5 0.6 0.7 0.8 0.9]]
'''
#横向拼接法一
print(np.vstack((a,b)))
#横向拼接法二
print(np.concatenate((a,b),axis=0))
'''
输出结果为
[[0. 1. 2. 3. 4. ]
[5. 6. 7. 8. 9. ]
[0. 0.1 0.2 0.3 0.4]
[0.5 0.6 0.7 0.8 0.9]]
'''
8.2 纵向拼接
import numpy as np
#拼接数组
a=np.arange(10).reshape(2,5)
'''
输出结果为
[[0 1 2 3 4]
[5 6 7 8 9]]
'''
b=np.linspace(0,1,endpoint=False,num=10).reshape(2,5)
'''
输出结果为
[[0. 0.1 0.2 0.3 0.4]
[0.5 0.6 0.7 0.8 0.9]]
'''
#纵向拼接法一
print(np.hstack((a,b)))
#纵向拼接法二
print(np.concatenate((a,b),axis=1))
'''
输出结果为
[[0. 1. 2. 3. 4. 0. 0.1 0.2 0.3 0.4]
[5. 6. 7. 8. 9. 0.5 0.6 0.7 0.8 0.9]]
'''
9.分割
9.1 横向分割
import numpy as np
a=np.arange(36).reshape(6,6)
'''
输出结果为:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 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]]
'''
#横向分割数组法一
print(np.hsplit(a,3))
#横向分割数组法二
print(np.split(a,3,axis=1))
'''
输出结果为:
[array([[ 0, 1],
[ 6, 7],
[12, 13],
[18, 19],
[24, 25],
[30, 31]]),
array([[ 2, 3],
[ 8, 9],
[14, 15],
[20, 21],
[26, 27],
[32, 33]]),
array([[ 4, 5],
[10, 11],
[16, 17],
[22, 23],
[28, 29],
[34, 35]])]
'''
9.2 纵向分割
import numpy as np
a=np.arange(36).reshape(6,6)
'''
输出结果为:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 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]]
'''
#纵向分割数组法一
print(np.vsplit(a,3))
#横向分割数组法二
print(np.split(a,3,axis=0))
'''
输出结果为:
[array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]]),
array([[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])]
'''
10.数据读取和保存
10.1 npy文件
import numpy as np
a=np.random.random((3,3))
'''
输出为:
[[0.50212588 0.25281993 0.29829224]
[0.73546263 0.28386965 0.68986956]
[0.14592709 0.71318903 0.3625369 ]]
'''
#保存一个ndarray数组到npy文件
np.save('./tmp/tmp.npy',a)
#读取npy文件
print(np.load('./tmp/tmp.npy'))
'''
输出为:
[[0.50212588 0.25281993 0.29829224]
[0.73546263 0.28386965 0.68986956]
[0.14592709 0.71318903 0.3625369 ]]
'''
10.2 npz文件
import numpy as np
a=np.random.random((3,3))
'''
输出为:
[[0.50212588 0.25281993 0.29829224]
[0.73546263 0.28386965 0.68986956]
[0.14592709 0.71318903 0.3625369 ]]
'''
b=np.random.randn(2,2)
'''
输出为:
[[ 0.19706792 -0.74165399]
[ 0.55448015 1.753524 ]]
'''
#保存多个ndarray数组到npz文件
np.savez('./tmp/tmp2.npz',a,b)
#读取npz文件
d=np.load('./tmp/tmp2.npz')
#展示有哪些ndarray数据
print(d.files) #输出为:['arr_0', 'arr_1']
#逐个展示npz文件里各个ndarray数据
print(d['arr_0'])
'''
输出为:
[[0.50212588 0.25281993 0.29829224]
[0.73546263 0.28386965 0.68986956]
[0.14592709 0.71318903 0.3625369 ]]
'''
print(d['arr_1'])
'''
输出为:
[[ 0.19706792 -0.74165399]
[ 0.55448015 1.753524 ]]
'''
10.3 txt文件
import numpy as np
a=np.random.random((3,3))
'''
输出为:
[[0.51002495 0.64689764 0.97295432]
[0.42998593 0.21590222 0.65957127]
[0.13704206 0.55542585 0.525483 ]]
'''
np.savetxt('./tmp/tmp3.txt',a)
#常规导入
print(np.loadtxt('./tmp/tmp3.txt'))
#可以进行填充缺失值的导入方式
print(np.genfromtxt('./tmp/tmp3.txt'))
'''
输出为:
[[0.51002495 0.64689764 0.97295432]
[0.42998593 0.21590222 0.65957127]
[0.13704206 0.55542585 0.525483 ]]
'''
11.数据的处理
11.1 乘法
import numpy as np
a=[[1,2],[3,4]]
b=[[1,1],[1,1]]
#作为二维数组进行相乘
print(np.array(a)*np.array(b))
'''
输出为:
[[1 2]
[3 4]]
'''
11.2 广播计算
import numpy as np
#广播计算
a=[[0]*3,[1]*3,[2]*3,[3]*3]
print(a)
'''
输出为:
[[0, 0, 0],
[1, 1, 1],
[2, 2, 2],
[3, 3, 3]]
'''
print(np.array(a)+np.array([1,2,3]))
'''
输出为:
[[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]]
'''
print(np.array(a)+np.array([[1],[2],[3],[4]]))
'''
输出为:
[[1 1 1]
[3 3 3]
[5 5 5]
[7 7 7]]
'''
11.2 去重、排序、均值等计算
import numpy as np
#读取iris数据集里的数据,并对其进行排序,去重,并求出和,累积和,均值,标准差,方差,最小值,最大值
data=np.loadtxt('./data/iris_sepal_length.csv')
#进行排序
data.sort()
#数据去重
data=np.unique(data)
#求和
print(np.sum(data)) #输出为:210.39999999999998
print(np.cumsum(data))
'''
输出为:
[ 4.3 8.7 13.2 17.8 22.5 27.3 32.2 37.2 42.3 47.5 52.8 58.2
63.7 69.3 75. 80.8 86.7 92.7 98.8 105. 111.3 117.7 124.2 130.8
137.5 144.3 151.2 158.2 165.3 172.5 179.8 187.2 194.8 202.5 210.4]
'''
print(np.mean(data)) #求均值 输出为:6.011428571428571
print(np.std(data)) #求标准差 输出为:1.0289443768310533
print(np.var(data)) #求方差 输出为:1.0587265306122449
print(np.min(data)) #求最小值 输出为:4.3
print(np.max(data)) #求最大值 输出为:7.9
12.参考文章
【创作不易,望点赞收藏,若有疑问,请留言,谢谢】