系列文章:
数据分析之numpy模块2——数组的切片、变形、级联、拆分与数学计算
数据分析之numpy模块3——数组的排序、乱序、索引与上下限设置
认识numpy模块
NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。
# 导入numpy库
import numpy as np
数组与列表的区别
1) 数组中存储的数据元素类型必须是统一类型;
2)优先级:
字符串 > 浮点型 > 整数;
当输入不同数据类型时,会被强转为优先级高的数据类型;
数组的创建
- 一维数组即是我们常说的向量(一阶张量);
- 二维数组即是我们常说的矩阵(二阶张量);
- 多维数组再往上需要使用张量表示,常量就是零阶张量。
1. 使用array创建数组
- 将相同数据类型的列表作为参数,使用逗号分隔每个列表,可以生成不同维度的数组。
1.1 np.array创建一维数组
import numpy as np
arr = np.array([1,2,3])
输出:array([1, 2, 3])
1.2 np.array创建多维数组
arr = np.array([[1,2,3],[4,5,6]])
arr
输出:array([[1, 2, 3],
[4, 5, 6]])
1.3 np.array尝试创建包含多种数据类型的数组
arr = np.array([1,2.2,3])
arr
输出:array([1. , 2.2, 3. ])
- 可以看到数据类型被强制转换为浮点类型;
2. 使用zeros创建全0数组
- 通过设置shape参数,生成一个全由0构成的指定形状的多维数组(默认浮点型)
np.zeros(shape=(3,4))
输出:array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
- 通过设置dtype参数可以修改数据类型为整型等其他类型
np.zeros(shape=(3,4),dtype=np.int32)
输出:array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
3. 使用ones创建全1数组
- 通过设置shape参数,生成一个全由1构成的指定形状的多维数组(默认浮点型)
np.ones(shape=(3,4))
输出:array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
- 通过设置dtype参数可以修改数据类型为整型等其他类型
np.ones(shape=(3,4),dtype=np.int32)
输出:array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
4. 使用linspace创建等间隔数组
- 在给定的范围内生成含num个数据的一维等间隔数列数组,需要使用其他方法升维
np.linspace(0,100,num=20)
输出:array([ 0. , 5.26315789, 10.52631579, 15.78947368,
21.05263158, 26.31578947, 31.57894737, 36.84210526,
42.10526316, 47.36842105, 52.63157895, 57.89473684,
63.15789474, 68.42105263, 73.68421053, 78.94736842,
84.21052632, 89.47368421, 94.73684211, 100. ])
5. 使用arange创建等差数组
- 在给定的范围内生成步长为step的一维等差数列数组,需要使用其他方法升维
np.arange(10,50,step=2)
输出:array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
44, 46, 48])
6. 使用random创建随机数组
6.1 np.random.randint 创建整型随机数组
- 在给定的范围内生成指定指定形状的多维随机数列数组,默认数据类型为整型
- 不设置size时生成的不是数组,而是一个指定范围内的随机整数
np.random.randint(0,100,size=(5,3))
输出:array([[19, 0, 17],
[72, 29, 13],
[69, 59, 68],
[63, 54, 87],
[70, 64, 0]])
6.2 np.random.normal 创建正态分布随机数组
- numpy.random.normal(loc=0.0,scale=1.0,size=None)参数说明:
参数loc(float):正态分布的均值。
参数scale(float):正态分布的标准差。
参数size(int或者整数元组):输出数组的形状,默认为None。
- 各参数不指定时的情况:
1)无参数时,返回的是一个标准正态分布(均值为0,标准差为1)下的随机值。
2)仅输入一个数值,将返回一个均值loc为输入值,标准差为1的正太分布下的随机值。
3)输入两个数值,将返回一个均值loc为输入值1,标准差scale为输入值2的正态分布下的随机值。
4)输入两个数值,外加一个数值N,将返回一个均值loc为输入值1,标准差scale为输入值2的正太分布下的(N,)的一维数组,包含N个数字。
5)输入两个数值,外加一个元组(M,N),将返回一个均值loc为输入值1,标准差scale为输入值2的正太分布下的(M,N)的二维数组,包含M*N个数字。
np.random.normal(0,1,5)
输出:[ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]
- 注意:正态分布数组指的是数组内部,不同区间的数据个数占比符合正态分布,我们可以绘制直方图查看
import matplotlib.pyplot as plt
# 绘图查看
s=np.random.normal(0,1,10000000)
plt.hist(s,bins=100)
plt.show()
6.3 np.random.rand 创建均匀分布随机数组
- rand(n,m)生成一个0-1之间的n*m的均匀随机矩阵
np.random.rand(10000,100)
输出:array([[6.32393809e-01, 4.25896509e-01, 1.92858279e-01, …,
5.12963811e-01, 9.44592221e-01, 6.88901172e-01],
[5.31388037e-01, 5.26622301e-02, 1.43953341e-01, …,
7.64786930e-01, 2.39814625e-01, 1.14334103e-01],
[8.78206312e-01, 6.46987813e-01, 3.91696529e-01, …,
5.23202345e-01, 2.93595486e-01, 6.89222564e-01],
…,
[4.22641621e-01, 6.42861196e-01, 1.05759087e-01, …,
9.34267242e-01, 4.84845268e-01, 6.89652018e-01],
[7.53819599e-01, 8.61629036e-01, 9.20819485e-01, …,
5.62177531e-04, 4.18046901e-01, 1.96747276e-01],
[1.49670429e-01, 5.40383374e-01, 6.56995314e-01, …,
5.90408060e-01, 3.80012454e-01, 1.72216829e-02]])
- 如果不指定size,那么生成的是一个0-1之间的随机浮点数
np.random.rand()
输出:0.4942851822609876
- 注意:这里的均匀分布同样是指数组内部,不同区间的数据个数占比分布均匀,我们可以绘制直方图查看
import matplotlib.pyplot as plt
# 绘图查看
X=random.rand(10000,100)
plt.hist(X,bins=100)
plt.show
6.4 np.random.randn 创建标准正太分布随机数组
- 其效果相当于np.random.normal(0,1,size=(n,m)),一般用于生成形状为n*m标准正太分布随机数组
import matplotlib.pyplot as plt
# 绘图查看
Y=random.randn(10000,100)
plt.hist(Y,bins=100)
plt.show
6.5 np.random.seed 创建标准正太分布随机数组
- 用于指定随机数/数组生成时所用的算法开始的整数值
- 如果代码中每次执行都使用相同的种子,所生成的随机数/数组是相同的
for i in range(5):
np.random.seed(10)
print(np.random.normal(0,1,5))
输出:[ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]
[ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]
[ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]
[ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]
[ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]
数组的属性
arr = np.random.randint(0,100,size=(5,6))
arr
输出:
array([[62, 65, 51, 15, 30, 63],
[37, 8, 55, 70, 13, 84],
[46, 44, 86, 11, 72, 91],
[10, 47, 3, 96, 9, 36],
[54, 24, 55, 72, 29, 45]])
1. shape:返回值是数组的形状
arr.shape
输出:(5, 6)
2. ndim:返回值是数组的维度数
arr.ndim
输出:2
3. size:返回值是数组元素的个数
arr.size
输出:30
4. dtype:返回值是数组元素的数据类型
arr.dtype
输出:dtype(‘int32’)
type(arr) #数组的数据类型
输出:numpy.ndarray
5. strides :每个维度的元素之间的字节数间隔
arr.strides
输出:(24, 4)
6. itemsize:每个元素的字节数
arr.itemsize
输出:4
7. nbytes:总的字节数
arr.nbytes
输出:120
8. data:存储数据的数据块
arr.data
输出:<memory at 0x000001C825526450>
9. flags:array的标志位 OWNDATA=True
arr.flags
输出:C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
数组的数据类型
数据类型表格如下:
arr = np.array([1,2,3])
arr.dtype
输出:dtype(‘int32’)
1. array(dtype=?):可以设定数据类型
#创建一个数组,指定数组元素类型为int32
arr = np.array([1,2,3],dtype='int32')
arr.dtype
输出:dtype(‘int32’)
2. arr.dtype = ‘?’:可以修改数据类型
arr.dtype = 'uint8' #修改原数组的元素类型
arr.dtype
输出:dtype(‘uint8’)
- 注意:这种方法适用于相同字节的不同数据类型间相互转换,如果由高字节转为低字节,由于创建时分配的空间不变,但单个元素所占字节数减少,最终多出来的空间会用0填补,原数组数据会被破坏且
总字节数nbytes
不变。
3. arr.astype(’?’):可以间接修改数据类型
arr8 = arr.astype('int8') #不修改原数组的元素类型,用一个新的对象承载原ndarray数组,但其元素的数据类型是修改后的
arr8.dtype
输出:dtype(‘int8’)
- 注意:可以调用flags属性查看arr8,可知该ndarray不是该变量名所拥有的,而是arr变量所拥有的,arr8只是作为第三方使用了该数组,并且以新的数据类型显示。