# NumPy入门
用Python做数据分析离不开两个最常用的库,NumPy和Pandas。
NumPy的全程叫Numerical Python, 是专门针对计算用的,NumPy是很多数据或科学相关Python包的基础。
# 一、安装与导入
安装命令:pip install numpy
导入命令:import numpy as np
"as np" 的意思是,给这个库一个别名叫np,这样使用这个库的任何东西时,都可以用np,而不是numpy来调用。目的是打字更少、更简洁。
# 二、N维数组(ND array)
NumPy里最核心的数据结构叫ND array。
NumPy的数组与Python的内置列表的异同
# 1、相似之处
arr = np.array([5, 17, 3, 26, 31])
1)都可以通过索引去获得某个元素
print(arr[0])
2)都可以通过切片获得某范围的多个元素
# 打印第1个到第4个之前元素
print(arr[0:3])
2
3)可以去迭代各个元素
for element in arr:
print(element)
2
# 2、不同之处
NumPy数组里的数据类型需要统一,而列表里的数据类型不需要统一
list = [5, "a", True, 12.2, "!"]
# 3、优点
1)在对NumPy数组进行大规模数学运算或其它操作时,执行速度远高于Python内置列表,因此效率是数据处理方面选择NumPy的首要原因。
2)NumPy提供了很多专门做运算的函数,为操作数据提供了很多便利。
# 三、创建数组
# (一)、array方法
1、创建一个数组,最直观的方法就是通过NumPy的array方法,把列表转换成数组。
2、如果传入的是"[1, 2, 3]"这样一个简单的列表,它会被转换成一维数组。
如果传入的是"[[1, 2, 3], [4, 5, 6]]"这样一个嵌套列表,也就是一个列表里面有另一个列表的情况,它会被转换成二维数组。一个简单的判断方法是,最左边有几个方括号,它就会被转换成几维的数组。
3、这里也可以试一下传入不同类型的元素,虽然不报错,但array方法会强制把它们转换成同一类型。
# (二)、其他方法
1、zeros方法
给zeros方法传入一个数字,会返回一个全部是0的,长度为那个数字的数组
np.zeros(3)
# 会返回
array([0., 0., 0.,])
2
3
由于数字类型是浮点数,所以每个数字后面有个小数点
2、ones方法
给ones方法传入一个数字,会返回一个全部是1的,长度为那个数字的数组
np.ones(3)
# 会返回
array([1., 1., 1.,])
2
3
3、arange方法
表示是针对array的range方法,里面传入的参数和range是一样的,第一个表示起始值,第二个表示结束值,第三个表示步长,*和range方法一样,结束值不会被包括在范围内
np.arange(5, 11, 2)
# 会返回
array([5, 7, 9])
2
3
# 四、数组的属性
# 1、ndim会返回给我们数组的维度
print(arr.ndim)
# 2、shape会返回一个元组,表示各个维度的元素的个数
print(arr.shape)
因为arr是一维数组,第一个维度有5个元素,所以会打印"(5,)"
*如果元组里面只有一个元素,它会用元素后面的逗号,来强调这是由一个元素组成的元组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2.shape)
2
因为arr2是二维数组,第一个维度有2个元素,第二个维度有3个元素,所以会打印"(2, 3)"的元组
# 3、size会返回数组里面元素的总个数
print(arr.size)
# 4、dtype会返回数组元素的类型
dtype表达的是data type的意思
print(arr.dtype)
会打印"int32",int开头说明类型是整数,32表示的是比特长度
# 五、针对NumPy数组的常用操作
# (一)、用concatenate函数连接数组
- concatenate函数接收的参数是列表,所以可以把两个数组,用中括号包围起来,作为一个列表传进去
- concatenate函数输出的结果,是两个数组里所有元素拼接起来后组成的新数组
import numpy as np
arr1 = np.array([5, 17, 3, 26, 31])
arr2 = np.zeros(2)
np.concatenate([arr1, arr2])
# 输出
array([ 5., 17., 3., 26., 31., 0., 0.])
2
3
4
5
6
7
可以看到数组里的数字后面都有个小数点,这是因为zeroes方法产生的是浮点数类型的数组,然后数组里数据类型又必须统一,所以拼接后的结果也是浮点数数组
由于传入列表的长度是不限的,所以也可以一次性拼接多个数组
np.concatenate([arr1, arr2, arr3])
# (二)、对内容进行排序
# 1、针对列表来说
1)sorted函数
传入列表后,就会返回一个新的排序好的列表
只返回排序好的新列表,不改变原始列表
也可以传入Series作为参数
2)sort方法
调用后,该列表里面的元素就都会被排序好
什么都不返回,但原始列表会被排序好
list1 = [5, 17, 3, 26, 31]
sorted_list1 = sorted(list1)
print(sorted_list1)
print(list1)
print(list1.sort())
print(list1)
2
3
4
5
6
7
结果
[3, 5, 17, 26, 31]
[5, 17, 3, 26, 31]
None
[3, 5, 17, 26, 31]
2
3
4
# 2、针对NumPy数组来说
1)NumPy的sort函数
np.sort会返回排序好的新的数组,但是传入的原始数组不会被改变
也可以传入Series作为参数
2)NumPy的sort方法
而数组的sort方法,会直接在该数组上进行改动,把元素排序好
你可以根据是否要直接更改数组,决定使用
arr1 = np.array([5, 17, 3, 26, 31])
print(np.sort(arr1))
print(arr1)
print(arr1.sort())
print(arr1)
2
3
4
5
6
结果
[ 3 5 17 26 31]
[ 5 17 3 26 31]
None
[ 3 5 17 26 31]
2
3
4
# (三)、用索引获得元素
# 1、获得某个元素
1)正着数,第一个元素的索引为0,后面依次+1
2)倒着数,最后一个元素的索引是-1,倒数第二个的索引是-2,以此类推
# 2、获得某范围的多个元素
切片会返回开头索引到结束索引前一个的所有元素
arr1[1: 4]
array([ 5, 17, 26])
2
3
# (四)、数组和数组进行运算
NumPy数组的强项之一是运算
以加减乘除为例
# 1、数组与数组之间
如果把形状相同的两个一维数组进行运算,会返回一个相同位置元素加减乘除后得到的数组。而列表做不到这么便捷了
arr4 = np.array([6, 7, 8, 9, 10])
arr5 = np.array([2, 2, 2, 2, 2])
print(arr4 + arr5)
print(arr4 - arr5)
print(arr4 * arr5)
print(arr4 / arr5)
2
3
4
5
6
[ 8 9 10 11 12]
[4 5 6 7 8]
[12 14 16 18 20]
[3. 3.5 4. 4.5 5. ]
2
3
4
# 2、数组和单个数字之间
如果学过线性代数,可以看成是向量和标量之间的运算
arr4 * 3
array([18, 21, 24, 27, 30])
2
3
这个例子里的乘3会运用在数组的每一个数字上,这种操作机制,叫做广播机制
# 3、聚合运算
a、聚合运算是指,通过一组值,来得到一个值
b、包括max求最大值,min求最小值,sum求和,mean求平均值等待
c、数组.操作名(),返回相应的运算结果
print(arr4.max())
print(arr4.min())
print(arr4.sum())
print(arr4.mean())
2
3
4
结果
10
6
40
8.0
2
3
4
# (五)、根据条件筛选数组元素
arr = np.array([-22, 3, 65, 9, 11, 7])
arr > 6
array([False, False, True, True, True, True])
2
3
4
# 1、数组与数字之间的操作
一个数组和一个数字之间的操作,根据广播机制,> 6
会被运用到每一个数字上,那产生的结果就是由True和False组成的布尔值数组,每个布尔值都代表了这个数字是否大于6
arr[arr > 6]
array([65, 9, 11, 7])
2
3
布尔值数组可以用来对形状相同的数组进行索引,在方括号里放上这个布尔值数组,相应位置为True的元素就会被筛选出来,那作为结果的数组里就会有那个元素
# 2、结合逻辑运算,让筛选逻辑更加复杂
与:Python里用and,在数组上用&
或:Python里用or,在数组上用|
非:Python里用not,在数组上用~
arr[(arr > 6) & (arr < 10)]
array([9, 7])
2
3
比如要筛选出所有大于6且小于10的数字,就把 > 6和 < 10这两个条件用括号括住,表示这两个条件要先于&计算
# 六、其他
np.nan表示缺失值,将np.nan赋值给其他变量,可以使变量为NaN值
np.nan
nan
2
3