文章一览
- 前言
- 一、排序
- 1.1 numpy.sort
- 1.2 numpy.argsort
- 1.3 numpy.lexsort
- 二、数组操作
- 2.1 数组元素迭代
- 2.2 数值舍入计算
- 2.3数值取整
- 2.4 数组去重
- 2.5 数组拼接
- 2.6 数组行列交换
- 三、文件读写
- 3.1 np.fromfile() 读文件
- 3.2 np.loadtxt() 读文件
- 3.3 用 csv 模块逐行处理 CSV 格式数据
- 3.4 读取结果生成一个字典
- 3.5 如何将 array 保存到 txt 文件中
前言
NumPy是Python中用于数值计算和科学计算的库。它提供了排序、数组操作和文件读写等功能。可以通过NumPy进行数组排序、形状改变、数组拼接和分割等操作。同时,还可以将数组保存为文本文件,并从文本文件中读取数据创建数组。NumPy是进行数据处理和分析的重要工具。
一、排序
numpy提供了大量用数组操作的函数,其中不乏常见的排序函数。
常见的有三种排序函数:
- numpy.sort
- numpy.argsort
- numpy.lexsort
1.1 numpy.sort
使用 numpy.sort 函数可以对数组进行排序,并返回排序好的数组
使用方法: numpy.sort(a, axis = 1, kind = None, order = None)
参数:
- a:要排序的数组
- axis : 按什么轴进行排序,默认水平方向进行排序
- kind :排序方法,默认是快速排序
- order :当数组定义了字段属性时,可以按照某个属性进行排序
import numpy as np
x = np.array([[90,85,95,80],[80,95,90,85],[170,170,185,165]])
x1 = np.sort(x)
x2 = np.sort(x,axis = 0)
1.2 numpy.argsort
numpy.argsort 函数用于将数组排序后,返回数组元素从小到大依次排序的所有元素索引
使用方法: numpy.argsort(a, axis = 1, kind = None, order = None)
- a:要排序的数组
- axis:按什么轴进行排序,默认按水平方向进行排序
- kind:排序方法,默认是快速排序
- order:当数组定义了字段属性时,可以按照某个属性进行排序
import numpy as np
x = np.array([[5,8,3], [8,3,10]])
x1 = np.argsort(x,axis = 0)
x2 = np.argsort(x,axis = 1)
1.3 numpy.lexsort
numpy.lexsort 函数用于按照多个条件(键)进行排序,返回排序后索引
使用方法: numpy.lexsort(keys, axis = -1)
- keys(k,N):(k,N) 数组或序列元组,要排序的 k 个不同的“列”。最后一列(如果键是二维数组,则为行)是主排序键
- axis:沿指定轴进行排序
- 返回指定轴对键进行排序的索引数组
numpy.lexsort 应用场景:高考录取学生按照总成绩排名录取。在总成绩相同时,数学成绩高的优先录取,在总成绩和数学成绩都相同时,按照语文成绩录取……
# 默认为从小到大排
>>> import numpy as np
>>> s = [590,585,570,585,570,570] # 总成绩
>>> m = [90, 85, 60, 68, 65, 70] # 数学成绩
# Sort by sum, then by math
>>> rank = np.lexsort((m,s))
[2 4 5 3 1 0]
二、数组操作
2.1 数组元素迭代
说到迭代,很容易想到直接对数组直接使用 for 循环操作,对于一维数组来说,当然是可以的
>>> import numpy as np
>>> x = np.array([1,2,3,4])
>>> for i in x:
>>> print(i)
1
2
3
4
>>> import numpy as np
>>> x = np.array([[1,2,3],[4,5,6]])
>>> for i in x:
>>> print(i)
[1 2 3]
[4 5 6]
有没有办法直接遍历二维数组里每一个元素?
>>> import numpy as np
>>> x = np.array([[1,2,3],[4,5,6]])
>>> for i in range(0,x.shape[0]):
>>> for j in range(0,x.shape[1]):
>>> print (x[i][j])
1
2
3
4
5
6
双层循环效率低。这个时候就需要用到 flat
方法,它可以将多维数组平铺为一维的迭代器
>>> import numpy as np
>>> x = np.array([[1,2,3],[4,5,6]])
>>> for i in x.flat:
>>> print(i)
1
2
3
4
5
6
2.2 数值舍入计算
around 函数,用于四舍五入,返回一个新数组
>>> import numpy as np
>>> x = np.array([1.4523,2.7348,3.1652])
>>> x = np.around(x,2)
[1.45 2.73 3.17]
2.3数值取整
floor 函数向下取整,ceil 函数向上取整,返回一个新数组
>>> import numpy as np
>>> x = np.array([1.45,2.78,3.12])
>>> x1 = np.floor(x)
[1. 2. 3.]
>>> x2 = np.ceil(x)
[2. 3. 4.]
2.4 数组去重
>>> import numpy as np
>>> x = np.array([2,3,5,1,3,8,1,0])
>>> x1 = np.unique(x)
[ 1 2 3 4 10]
2.5 数组拼接
np.vstack
:按垂直方向(行顺序)堆叠数组构成一个新的数组
np.hstack
:按水平方向(列顺序)堆叠数组构成一个新的数组
注意:它只能给一个参数,所以要用括号括起来。
>>> import numpy as np
>>> a = np.array([2,5,7,8])
>>> b = np.array([1,3,9,10])
>>> c = np.vstack((a,b))
[[2 5 7 8][1 3 9 10]]
>>> import numpy as np
>>> a = np.array([2,5,7,8])
>>> b = np.array([1,3,9,10])
>>> c = np.hstack((a,b))
[2 5 7 8 1 3 9 10]
2.6 数组行列交换
数组水平或者垂直拼接很简单,但拼接之前应注意什么?
比如垂直拼接的时候,每一列代表的意义必须相同!如何交换某个数组的行或列呢?
>>> import numpy as np
>>> a = np.arange(1,13).reshape(3,4)
[[ 1 2 3 4][ 5 6 7 8][ 9 10 11 12]]
>>> a[[1,2],:] = a[[2,1],:]
[[ 1 2 3 4][ 9 10 11 12][ 5 6 7 8]]>>> import numpy as np
>>> a = np.arange(1,13).reshape(3,4)
[[ 1 2 3 4][ 5 6 7 8][ 9 10 11 12]]
>>> a[:,[0,2]] = a[:,[2,0]]
[[ 3 2 1 4][ 7 6 5 8][11 10 9 12]]
在多维数组索引中,逗号用于分隔不同维度的索引。逗号后面的 :
表示对列维度的全选,而前面的 [1,2]
指定了行索引。
a[[1,2],:]
则明确表示你想要的是第二行和第三行的所有列;
a[:,[0, 2]]
当表示需要第0列和第2列时,逗号要放在前面。
三、文件读写
3.1 np.fromfile() 读文件
numpy 可以方便的进行文件读写。使用 np.fromfile 函数从文本或二进制文件读入数据
numpy.fromfile (file, dtype = float, count = -1, sep ='', offset = 0)
- file:要读取的文件名
- dtype:返回数组的数据类型
- count:要阅读的项目数。 -1 表示所有项目(即完整文件)
- sep:表示使用空白字符来分隔数据
- offset:与文件当前位置的偏移量,默认值为0。仅允许用于二进制文件
import numpy as np
d = np.fromfile('housing.data', sep = ' ')
空格或者回车都属于空白字符,读入的数据被转化成 1 维数组
如果想把一维数组转换成二维或多维,使用 reshape 即可
import numpy as np
d = np.fromfile('housing.data', sep = ' ')
d1 = d.reshape (-1,14)
3.2 np.loadtxt() 读文件
通常使用 numpy 中的 loadtxt()函数读取txt文件
- fname:要读取的文件
- comments:如果行的开头为#就会跳过该行
- delimiter:分隔符
- skiprows:跳过前几行读取,默认是0,必须是int整型
- converters 字典类型,对某列数据类型进行转换
- usecols:要读取哪些列(比如:usecols = (1,3),读取1和3列)(这里的列是从1开始编号)
- unpack:如果为True,将分列读取
- ndmin:指定生成数组的维度
import numpy as np
a = np.loadtxt('test.txt')import numpy as np
a = np.loadtxt('test.txt',comments='#')import numpy as np
a = np.loadtxt('test.txt',usecols = [0,3])
print(a)
取出数据以后(再通过切片操作),就可以进行分析、统计、可视化等处理了
3.3 用 csv 模块逐行处理 CSV 格式数据
csv.reader(fname, delimiter = None)
返回一个 reader 对象,利用该对象可以遍历csv文件中的行,从 csv 文件中读取的每一行都以字符串列表的形式返回
import csv
with open ('student.csv','r') as f:csv_r = csv.reader(f)for row in csv_r:print(row)
3.4 读取结果生成一个字典
读取结果生成一个字典(dict),用 csv.DictReader(files)
import csv
with open('student2.csv') as csvfile: data = list(csv.DictReader(csvfile))
print ('记录个数:', len(data))
print ('记录:', data)
print ('列名:', list(data[0].keys()))
读取了数据,就可以进行数据处理了
3.5 如何将 array 保存到 txt 文件中
import numpy as np
arr = np.array([1,5,3,4,10,0,9])
np.savetxt('ar.txt', arr,fmt='%d',delimiter = '')
f = np.loadtxt ('ar.txt')
print(f)
- array_text.txt:参数为文件路径以及 txt 文本名
- arr:存入文件的数组名
- fmt=‘%d’:为指定保存的文件格式,这里为十进制
- delimiter= ’ ':表示分隔符,这里以空格的形式隔开