Python生态系统为数据分析师和数据科学家提供了多种数据库,其中Numpy和Pandas是非常重要的两个库,我们的很多数据处理及分析方法就源于其中。
Numpy:这是一个通用程序库,不仅支持常用的数值数组,同时提供了用于高效处理这些数组的函数。
Numpy数组是一个多维数组对象,称为ndarray。
要使用Numpy进行数据分析,首先载入numpy包。因为它是第三方工具,所以每次使用前必须在代码中载入。import 包 as 别名 。(别名常用np,这是numpy约定俗成的简写。)
# 导入numpy包
import numpy as np
使用numpy中的array()函数,新手要记住加np。将系统自带的列表list转换成了numpy中的数组。
除了利用列表创建numpy中的数组,还有其他方式:
# 创建数组:array()函数,括号内可以是列表、元祖、数组、生成器等
## 数组的轴数
在Numpy中维度(dimensions)叫做轴(axes),轴的个数叫做秩。
用 ndarray.ndim 查询
ar1 = np.array([1, 2, 3, 4, 5])
ar2 = np.array([[ 1, 2, 3, 4, 5 ],
[ 6, 7, 8, 9, 10 ]])
print(ar1.ndim)
print(ar2.ndim)
输出结果:
1
2
上面案例中,ar1是一个一维数组,轴只有1个,也可以说是秩为1;而ar2 是一个二维数组,有2个轴,所以可以说是秩为2。
## 数组的维度
对于n行m列的数组,shape为(n,m)
用 ndarray.shape 查询
ar1 = np.array([1, 2, 3, 4, 5])
ar2 = np.array([[ 1, 2, 3, 4, 5 ],
[ 6, 7, 8, 9, 10 ]])
print(ar1.shape)
print(ar2.shape)
输出结果:
(5,)
(2, 5)
## 数组的元素总数
对于n行m列的数组,元素总数为n*m
用 ndarray.size 查询
ar1 = np.array([1, 2, 3, 4, 5])
ar2 = np.array([[ 1, 2, 3, 4, 5 ],
[ 6, 7, 8, 9, 10 ]])
print(ar1.size)
print(ar2.size)
输出结果:
5
10
## 数组的元素类型
数组中元素的类型,类似type()(注意了,type()是函数,.dtype是方法)
用 ndarray.dtype 查询
ar1 = np.array([1., 2., 3., 4., 5.])
ar2 = np.array([[ 1, 2, 3, 4, 5 ],
[ 6, 7, 8, 9, 10 ]])
print(ar1.dtype)
print(ar2.dtype)
输出结果:
float64
int32
这里介绍一下Numpy常用的通用函数,基本运算以及索引,切片等。
【通用函数篇】
## 数组形状
ndarray.T / ndarray.reshape() / ndarray.resize()
# ndarray.T 方法:转置,如原shape为(3,4),转置结果为(4,3) → 所以一维数组转置后结果不变
## 数据类型转变
ndarray.astype(),实际处理项目时,需要利用函数转为可以计算的数据类型
ar1
## 数组的复制
ndarray.copy()
# copy方法生成数组及其数据的完整拷贝
ar1 = np.arange(10)
ar2 = ar1
print(ar2 is ar1)
输出结果:
True
————————————————————————————————————————————————
ar1[2] = 9
print(ar1,ar2)
输出结果:
[0 1 9 3 4 5 6 7 8 9]
[0 1 9 3 4 5 6 7 8 9]
————————————————————————————————————————————————
ar3 = ar1.copy()
print(ar3 is ar1)
ar1[0] = 9
print(ar1,ar3)
输出结果:
False
[9 1 9 3 4 5 6 7 8 9]
[0 1 9 3 4 5 6 7 8 9]
【基本运算篇】
# 与标量的运算
ar = np.arange(6).reshape(2,3)
print(ar)
print(ar + 10) # 加法
print(ar * 2) # 乘法
print(1 / (ar+1)) # 除法
输出结果:
[[0 1 2]
[3 4 5]]
[[10 11 12]
[13 14 15]]
[[ 0 2 4]
[ 6 8 10]]
[[ 1. 0.5 0.33333333]
[ 0.25 0.2 0.16666667]]
————————————————————————————————————————————————
print(ar.mean()) # 求平均值
print(ar.max()) # 求最大值
print(ar.min()) # 求最小值
print(ar.std()) # 求标准差
print(ar.var()) # 求方差
输出结果:
2.5
5
0
1.70782512766
2.91666666667
————————————————————————————————————————————————
print(ar.sum()) # 求和,np.sum() →默认 axis为1,按行求和
print(ar.sum(axis = 0)) # 求和,np.sum() →修改 axis为0,按列求和
print(np.sort(np.array([1,4,3,2,5,6]))) # 排序
输出结果:
15
[3 5 7]
[1 2 3 4 5 6]
【索引,切片篇】
核心:基本索引及切片 / 布尔型索引及切片
## 基本索引,切片, ndarray数组的下标索引是从0开始
# 一维数组索引,切片
ar = np.arange(10)
print(ar)
print(ar[4])
print(ar[3:6]) # 和之前学习的列表等容器索引相容,左闭右开
输出结果:
[ 0 1 2 3 4 5 6 7 8 9 ]
4
[ 3 4 5 ]
# 二维数组索引及切片
ar = np.arange(16).reshape(4,4)
print(ar, '数组轴数为%i' %ar.ndim) # 4*4的数组
# 输出结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]] 数组轴数为2
————————————————————————————————————————————————
print(ar[2]) # 二维数组,索引从行开始切,得到整行数据
print(ar[2][1]) # 二次索引,得到一维数组中的一个值
print(ar[2,1]) # 切片数组中的第三行第三列 → 10
# 输出结果:
[ 8 9 10 11]
9
9
——————————————————————————————————————————————————
print(ar[1:3]) # 切片为两个一维数组组成的二维数组
print(ar[:2,1:]) # 切片数组中的1,2行、2,3,4列 → 二维数组
输出结果:
[[ 4 5 6 7]
[ 8 9 10 11]]
[[1 2 3]
[5 6 7]]
## 布尔型索引及切片
# 布尔型索引,以布尔型的矩阵去做筛选
ar = np.arange(12).reshape(3,4)
i = np.array([True,False,True])
j = np.array([True,True,False,False])
print(ar)
print(i)
print(j)
输出结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[ True False True]
[ True True False False]
—————————————————————————————————————————————————
print(ar[i,:]) # 在第一维度做判断,只保留True的部分
print(ar[:,j]) # 在第二维度做判断,只保留True的部分
输出结果:
[[ 0 1 2 3]
[ 8 9 10 11]]
[[0 1]
[4 5]
[8 9]]
## 数组索引及切片的值更改、复制
# 一个标量赋值给一个索引/切片时,会自动改变/传播原始数组
ar = np.arange(10)
print('改之前的数组ar:', ar)
ar[5] = 100
ar[7:9] = 200
print('改之后的数组ar:', ar)
输出结果:
改之前的数组ar: [ 0 1 2 3 4 5 6 7 8 9 ]
改之后的数组ar: [ 0 1 2 3 4 100 6 200 200 9 ]
——————————————————————————————————————————————————
# 数组复制,处理项目时,避免对原数据进行处理而是在复制版本上处理
ar = np.arange(10)
b = ar.copy()
b[7:9] = 200
print(ar)
print(b)
# 输出结果:
[0 1 2 3 4 5 6 7 8 9]
[ 0 1 2 3 4 5 6 200 200 9 ]
#在复制版本上修改,并不改变原数据
Numpy初级入门需要了解的部分已经差不多啦,如果想更深入的应用,还是用实战解决吧!下一章,将会讲解Pandas初级入门需要了解的知识哦~。