当前位置: 首页 > article >正文

Numpy指南:解锁Python多维数组与矩阵运算(下)

文章一览

  • 前言
  • 一、排序
    • 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= ’ ':表示分隔符,这里以空格的形式隔开

http://www.kler.cn/a/456957.html

相关文章:

  • 计算机网络 (17)点对点协议PPP
  • 03-spring-理-DefaultListableBeanFactory
  • Kafka消息不丢失与重复消费问题解决方案总结
  • C#编写的金鱼趣味小应用 - 开源研究系列文章
  • uniapp——APP读取bin文件,解析文件的数据内容(二)
  • 教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件
  • LeetCode--排序算法(堆排序、归并排序、快速排序)
  • 防抖和节流的方法详解和CSS文本溢出小知识
  • 【学习总结|DAY025】JAVA-WEB基础
  • 代码随想录算法训练营第十六天-二叉树-513.找树左下角的值
  • python常用内建模块:struct
  • React(一)—— router/useRef/useState
  • 地理数据库Telepg面试内容整理-如何解决大规模地理数据导入时出现的性能瓶颈
  • 灾备方案和架构类型、跨区域
  • hive中的四种排序类型
  • SVN和Git
  • Day1 微服务 单体架构、微服务架构、微服务拆分、服务远程调用、服务注册和发现Nacos、OpenFeign
  • 代码解析:安卓VHAL的AIDL参考实现
  • Android 自定义shell命令
  • 4.银河麒麟V10(ARM) 离线安装 MySQL
  • 在线学习平台-项目技术点-前台
  • Mono里运行C#脚本6—mono加载EXE文件和DLL文件保存的HASH表
  • PPO(近端策略优化)算法基本原理
  • 跨境办公的网络如何选择?
  • [Rust开发]actix_webmiddleware 中间件
  • CSS系列(42)-- Backdrop Filter详解