Python数据分析—NumPy

Python

# 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

1)都可以通过索引去获得某个元素

print(arr[0])
1

2)都可以通过切片获得某范围的多个元素

# 打印第1个到第4个之前元素
print(arr[0:3])
1
2

3)可以去迭代各个元素

for element in arr:
    print(element)
1
2

# 2、不同之处

NumPy数组里的数据类型需要统一,而列表里的数据类型不需要统一

list = [5, "a", True, 12.2, "!"]
1

# 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.,])
1
2
3

由于数字类型是浮点数,所以每个数字后面有个小数点

2、ones方法

给ones方法传入一个数字,会返回一个全部是1的,长度为那个数字的数组

np.ones(3)
# 会返回
array([1., 1., 1.,])
1
2
3

3、arange方法

表示是针对array的range方法,里面传入的参数和range是一样的,第一个表示起始值,第二个表示结束值,第三个表示步长,*和range方法一样,结束值不会被包括在范围内

np.arange(5, 11, 2)
# 会返回
array([5, 7, 9])
1
2
3

# 四、数组的属性

# 1、ndim会返回给我们数组的维度

print(arr.ndim)
1

# 2、shape会返回一个元组,表示各个维度的元素的个数

print(arr.shape)
1

因为arr是一维数组,第一个维度有5个元素,所以会打印"(5,)"

*如果元组里面只有一个元素,它会用元素后面的逗号,来强调这是由一个元素组成的元组

arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2.shape)  
1
2

因为arr2是二维数组,第一个维度有2个元素,第二个维度有3个元素,所以会打印"(2, 3)"的元组

# 3、size会返回数组里面元素的总个数

print(arr.size)
1

# 4、dtype会返回数组元素的类型

dtype表达的是data type的意思

print(arr.dtype)
1

会打印"int32",int开头说明类型是整数,32表示的是比特长度

# 五、针对NumPy数组的常用操作

# (一)、用concatenate函数连接数组

  1. concatenate函数接收的参数是列表,所以可以把两个数组,用中括号包围起来,作为一个列表传进去
  2. 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.])
1
2
3
4
5
6
7

可以看到数组里的数字后面都有个小数点,这是因为zeroes方法产生的是浮点数类型的数组,然后数组里数据类型又必须统一,所以拼接后的结果也是浮点数数组

由于传入列表的长度是不限的,所以也可以一次性拼接多个数组

np.concatenate([arr1, arr2, arr3])
1

# (二)、对内容进行排序

# 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)
1
2
3
4
5
6
7

结果

[3, 5, 17, 26, 31]
[5, 17, 3, 26, 31]
None
[3, 5, 17, 26, 31]
1
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)
1
2
3
4
5
6

结果

[ 3  5 17 26 31]
[ 5 17  3 26 31]
None
[ 3  5 17 26 31]
1
2
3
4

# (三)、用索引获得元素

# 1、获得某个元素

1)正着数,第一个元素的索引为0,后面依次+1

2)倒着数,最后一个元素的索引是-1,倒数第二个的索引是-2,以此类推

# 2、获得某范围的多个元素

切片会返回开头索引到结束索引前一个的所有元素

arr1[1: 4]

array([ 5, 17, 26])
1
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)
1
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. ]
1
2
3
4

# 2、数组和单个数字之间

如果学过线性代数,可以看成是向量和标量之间的运算

arr4 * 3

array([18, 21, 24, 27, 30])
1
2
3

这个例子里的乘3会运用在数组的每一个数字上,这种操作机制,叫做广播机制

# 3、聚合运算

a、聚合运算是指,通过一组值,来得到一个值

b、包括max求最大值,min求最小值,sum求和,mean求平均值等待

c、数组.操作名(),返回相应的运算结果

print(arr4.max())
print(arr4.min())
print(arr4.sum())
print(arr4.mean())
1
2
3
4

结果

10
6
40
8.0
1
2
3
4

# (五)、根据条件筛选数组元素

arr = np.array([-22, 3, 65, 9, 11, 7])
arr > 6

array([False, False,  True,  True,  True,  True])
1
2
3
4

# 1、数组与数字之间的操作

一个数组和一个数字之间的操作,根据广播机制,> 6会被运用到每一个数字上,那产生的结果就是由True和False组成的布尔值数组,每个布尔值都代表了这个数字是否大于6

arr[arr > 6]

array([65,  9, 11,  7])
1
2
3

布尔值数组可以用来对形状相同的数组进行索引,在方括号里放上这个布尔值数组,相应位置为True的元素就会被筛选出来,那作为结果的数组里就会有那个元素

# 2、结合逻辑运算,让筛选逻辑更加复杂

与:Python里用and,在数组上用&

或:Python里用or,在数组上用|

非:Python里用not,在数组上用~

arr[(arr > 6) & (arr < 10)]

array([9, 7])
1
2
3

比如要筛选出所有大于6且小于10的数字,就把 > 6和 < 10这两个条件用括号括住,表示这两个条件要先于&计算

# 六、其他

np.nan表示缺失值,将np.nan赋值给其他变量,可以使变量为NaN值

np.nan

nan 
1
2
3
最近修改于: 2024/12/12 23:51:38
和宇宙温柔的关联
房东的猫