python数据处理模块_Python数据分析模块一:NumPy

NumPy全称Numerical Python,是目前Python数值运算中最重要的基础模块,在命令行中输入pip install numpy即可安装。NumPy中最重要的对象是多维数组(ndarray),它是一系列相同类型数据的集合。

1. 一维数组

1) 创建一维数组

要创建一个一维数组,将一个列表作为参数传入numpy中的array()方法即可。

import numpy as np

data = np.array([1, 2, 3, 4, 5])

print(data)

# 输出:[1 2 3 4 5]

此外,还可以使用np.ones()和np.zeros()来生成元素全为1或0的数组。默认生成浮点数,可以传入dtype来指定为整数类型。

ones = np.ones(3)

print(ones)

# 输出:[1. 1. 1.]

zeros = np.zeros(3, dtype = 'int')

print(zeros)

# 输出:[0 0 0]

2) 一维数组的加减乘除

运算规则:将两个数组中对应位置的元素一一进行运算。两个数组的形状(一维数组中可以理解为长度)必须一致才能进行四则运算。

data = np.array([1, 2])

ones = np.ones(2)

print(data + ones)

# 输出:[2. 3.]

此外,一维数组也可以直接和数字进行计算,与数字的运算会作用在数组中的每个元素上。

data = np.array([1, 2])

print(data + 1)

# 输出:[2 3]

3) 索引和分片

numpy中一维数组的索引也是从0开始,以一维数组的长度减1结束。反向索引在数组中同样适用。

data = np.array([1, 2, 3])

print(data[1])

# 输出:2

一维数组的分片也与列表的分片类似,形如data[m:n],是左闭右开区间,同样也支持反向索引分片。

Note: 对列表分片后的数据进行更改不会影响原数据,但对多维数组分片后的数据进行更改会影响原数据,因为numpy中的切片不是复制一份副本,而是返回原数据中的一块。

此外,分片支持传入第三个参数——步长。步长的默认值为1。

data = np.array([1, 2, 3, 4, 5, 6])

print(data[::2])

# 输出:[1 3 5]

当步长为负数时,会将顺序反转。

data = np.array([1, 2, 3, 4, 5])

print(data[::-1])

# 输出:[5 4 3 2 1]

4) 通用方法

描述统计学中的数据指标主要分为两类:集中趋势和离中趋势。

集中趋势反映的是一组数据所具有的共同趋势,它代表了一组数据的总体水平,常用指标有平均数、中位数、众数。

离中趋势指一组数据中各数据值以不同程度的距离偏离其中心(平均数)的趋势,常用指标有极差、方差、标准差。求平均数:mean()

求中位数:median()

求最小值:min()

求最大值:max()

求极差:ptp()

求标准差:std()

求方差:var()

上述方法有两种使用方式,一种是直接在数组上调用,如data.std();另一种是在numpy上调用并传入数据,如np.std(data),但求中位数的median()方法只能在numpy上调用。

2. 多维数组

1) 创建多维数组

一维数组只有行,二维数组相比一维数组多了列这个维度,而三维数组则类似多个二维数组堆叠在一起。与列表进行类比,二维数组相当于单层的嵌套列表,可以将单层嵌套列表传入np.array()方法创建一个二维数组。

list = [[1, 2], [3, 4]]

data = np.array(list)

print(data)

# 输出:

# [[1 2]

# [3 4]]

同样,ones()和zeros()方法也能快速创建元素全部为1或0的多维数组。如:np(ones(m, n))表示创建一个m行n列且元素全为1的二维数组。

zeros = np.zeros((3, 2))

print(zeros)

# 输出:

# [[0. 0.]

# [0. 0.]

# [0. 0.]]

更多维的数组的创建,只要传入嵌套层数更多的列表即可。

描述多维数组的属性:ndim:多维数组维度的个数

shape:多维数组的形状

size:多维数组中所有元素的个数

dtype:多维数组中元素的类型

2) 多维数组的加减乘除

维度相同的数组间可以进行计算的条件是形状一样,形状不一样的数组元素无法一一对应,因此会报错。

维度不同的数组也可以进行计算,依据numpy中的广播规则,较小维度的数组可以在较大维度的数组上进行广播,以使它们具有兼容的形状。当运算中的两个数组形状不同时,numpy将自动在较小维度数组的shape元组前补1,直到两个数组的shape元组长度相同;接下来将元素在值为1的维度上进行复制,直到两个数组的形状相同。

data = np.array([[1, 2, 3], [4, 5, 6]])

ones = np.ones(3)

print(data.shape)

print(ones.shape)

print(data + ones)

# 输出:

# (2,3)

# (3,)

# [[2. 3. 4.]

# [5. 6. 7.]]

3) 通用方法

二维数组不仅可以对所有数据进行计算,还可以针对某个维度上的数据进行计算。在numpy中,用axis参数来指定轴。一维数组中,axis=0代表它唯一的轴;二维数组中,axis=0和axis=1分别代表其中的行轴和列轴。

通过axis参数可以指定计算方向。以二维数组中的max()方法为例,指定axis=0会在行轴方向求最大值,指定axis=1会在列轴方向求最大值。

data = np.array([[1, 2], [5, 3], [4, 6]])

print(data.max())

# 输出:6

print(data.max(axis=0))

# 输出:[5 6]

print(data.max(axis=1))

# 输出:[2 5 6]

4) 索引和分片

二维数组的索引和分片与与一维数组类似,只是在行索引的基础上再加上列索引,形如data[m, n],m是行索引或分片,n是列索引或分片。

data = np.array([[1, 2], [3, 4], [5, 6]])

print(data[0, 1]) # 获取第一行第二列的元素

# 输出:2

print(data[:, 0]) # 获取整个第一列

# 输出:[1 3 5]

print(data[1:3]) # 获取二、三两行,相当于data[1:3, :]

# 输出:

# [[3 4]

# [5 6]]

此外,也可以将布尔值作为索引来获取需要的元素。

data = np.array([[1, 2], [3, 4], [5, 6]])

print(data[data > 3])

# 输出:[4 5 6]

若需要用到多个条件,在布尔索引中,and写为&,or写为|,not写为~,并且每个条件要用括号括起来。此外,也可以使用==和!=来筛选数据。

data = np.array([[1, 2], [3, 4], [5, 6]])

print(data[(data > 3) & (data < 5)])

# 输出:[4]

print(data[(data > 3) | (data < 2)])

# 输出:[1 4 5 6]

print(data[(data > 3) | ~ (data < 2)])

# 输出:[2 3 4 5 6]

print(data[data == 3])

# 输出:[3]

print(data[data != 3])

# 输出:[1 2 4 5 6]

3. 其他实用方法

1) arange()方法

numpy中的arange()方法与Python中的range()用法类似,可以自动生成数组。

print(np.arange(1, 10))

# 输出:[1 2 3 4 5 6 7 8 9]

print(np.arange(1, 10, 2)) # 步长为2

# 输出:[1 3 5 7 9]

2) 随机方法

numpy中的np.random.rand()方法可以生成多个[0, 1)之间的随机小数,只要传入要生成的随机数组的形状即可。

print(np.random.rand())

# 输出:0.24913125061962405

print(np.random.rand(3))

# 输出:[0.36181313 0.12138735 0.63470135]

print(np.random.rand(2, 3))

# 输出:

# [[0.0395043 0.5270906 0.22671457]

# [0.50746222 0.86116847 0.76372812]]

此外,np.random.randint(m, n)可以生成[m, n)之间的整数,第三个参数支持传入生成的数组的形状。

print(np.random.randint(0, 10))

# 输出:2

print(np.random.randint(0, 10, 3))

# 输出:[0 8 7]

print(np.random.randint(0, 10, (2, 3)))

# 输出:

# [[6 8 8]

# [2 6 2]]

3) genfromtxt()方法

genfromtxt()方法用于文件的读取,常用的两个参数分别是数据源和分隔符,其返回值是一个多维数组。

# 例如用numpy读取一个以逗号分隔的csv文件

data = np.genfromtxt('data.csv', delimiter = ',')

在实际应用中,可以使用genfromtxt()方法读取多个数据集进行运算。例如,有两个文件,分别是实际值数据集文件labels.csv和预测值数据集文件predictions.csv,可以计算他们的均方误差来判断模型的预测结果准确性。

labels = np.genfromtxt('labels.csv', delimiter = ',')

predictions = np.genfromtxt('predictions.csv',delimiter = ',')

error = (1 / labels.size) * np.sum(np.square(predictions - labels))

print(error)

4) insert()方法

用于numpy数组插入,支持传入四个参数,分别是要插入的数组、插入的索引位置、要插入的值和插入针对的轴(可选)。返回值是插入后的新数组,不会修改原数组。

5) unique()方法

np.unique()方法可以用于去除数组中的重复项,返回不重复的数据。再加上return_counts=True参数,还会额外返回去重后数据出现的次数。

6) 排序方法

单纯对数据进行排序可以使用sort()方法。

arr = np.array([3, 1, 2])

arr.sort()

print(arr)

# 输出:[1 2 3]

若要返回排序后元素在原数组中的索引,可以使用argsort()方法。

arr = np.array([3, 1, 2])

arr.argsort()

print(arr)

# 输出:[1 2 0]

7) 数组转置

transpose()方法可以用来进行数组转置,比如可以将3*2的数组转置为2*3的数组。

arr = np.array([1, 2], [3, 4], [5, 6])

print(arr.transpose())

# 输出:

# [[1 3 5]

# [2 4 6]]

Reference:

[1] Wes McKinney. 2017. Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython, 2nd Edition [M]. O'Reilly Media, Inc.

[2] CSDN博客. Python博客[OL]. https://www.csdn.net/nav/python. 2020.

[3] 扇贝编程. Python数据分析[OL]. 扇贝编程. 2020.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值