作者:王皓
在学习Numpy之前我们需要了解一个概念:数组维数。
Numpy是最著名的 Python库之一,常用于高性能计算。Numpy提供了两种基本对象:ndarray和ufunc。
当然这里就有一个问题出现了,Python已有列表类型,为什么需要一个数组对象(类型)?
但是Python内置的array模块既不支持多维数组功能,又没有配套对应的计算函数,所以基于Numpy的ndarray在很大程度上改善了Python内置array模块的不足,将重点介绍ndarray的创建与索引。
1)ndarray数据类型
这时有人会问,为什么要支持这么多种数据类型?是因为对比Python语法来说仅支持整数、浮点数和复数3种类型,但是当科学计算涉及数据较多,对存储和性能都有较高要求,所以对数据类型进行精细定义,有助于NumPy合理使用存储空间并优化性能和程序员对程序规模有合理评估。
2)ndarray创建
这里笔者再补充四种方法并整理出来:
- 从Python中的列表、元组等类型创建ndarray数组
- 使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等
- 从字节流(raw bytes)中创建ndarray数组
- 从文件中读取特定格式,创建ndarray数组
3)随机数
2. ndarray的索引和切片
1)一维ndarray的索引
2)多维ndarray的索引
代码清单如下:
import numpy as npprint(np.arange(10))输出:
[[ 1 2 3 4 5]
[ 4 5 6 7 8]
[ 7 8 9 10 11]]
#访问第0行中第3列和第4列元素print('切片结果:',arr[0,3:5])切片结果:[4 5]
#访问第1行和第二行中第2列、第3列和第4列的元素print('切片结果:\n',arr[1:,2:])切片结果:
[9 10 11]
#访问第2列的元素print('切片结果:',arr[:2])切片结果:[3 6 9]
输出:
[2 8]花式索引是一个Numpy术语,是在基础索引方式之上衍生出的功能更强大的索引方式。它能够利用整数ndarray进行索引。
语法格式数值等都没有什么错误的情况下,初步怀疑是函数本身的原因,于是用help()函数查看它的详细介绍,竟然查到了:
nerror="javascript:errorimg.call(this);">
输出:
nerror="javascript:errorimg.call(this);">
输出:
nerror="javascript:errorimg.call(this);">
#利用np.ix函数将两个一维的整数ndarray转化为方形区域的索引器print('使用ix成片索引arr结果为:\n', arr[np.ix_([5, 1, 4, 2], [3, 0, 1, 2])])out[15]为什么会返回这样一个结果?是因为ix函数结果的排序是基于[5,1,4,2],[3,0,1,2]两个数组产生的笛卡尔积,即(5,3),(5,0),(5,1),(5,2);(1,3),(1,0),(1,1),(1,2);(4,3),(4,0),(4,1),(4,2);(2,3),(2,0),(2,1),(2,2)。然后按照索引(5,3),(5,0),(5,1),(5,2)得到第0行元素:23 20 21 22,之后的以此类推。
02 ndarray的基础操作
书中已经介绍了12种基本函数和它们的代码演示:
- 通过reshape方法改变ndarray形状
- 通过resize方法改变ndarray形状
- 通过修改shape属性改变ndarray维度
- 使用ravel方法展平ndarray
- 使用flatten方法展平ndarray
- 使用hstack函数实现ndarray横向组合
- 使用vstack函数实现ndarray纵向组合
- 使用concatenate函数组合ndarray
- 使用dstack函数组合ndarray
- 使用hsplit函数实现ndarray横向分割
- 使用vsplit函数实现ndarray纵向分割
- 使用split函数分割ndarray
- 使用dsplit函数实现ndarray深度分割
但请注意深度分割函数dsplit的使用条件:
import numpy as nparr=np.arange(12)arr.shape = (4, 3)print('\n', arr)输出:
形状改变后,ndarray arr的维度为:2
'''dsplit分割的ndarray必须是三维ndarray,且分割的数目必须为shape属性中下标为2的值的公约数。比如这里的分割数就是36,下标为2的值是4,符合要求'''arr = np.arange(36).reshape(3,3,4)print('创建的三维ndarrary arr为:\n',arr)创建的三维 ndarrary arr为:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 12 13 14 15]
[ 16 17 18 19]
[ 20 21 22 23]]
[[ 24 25 26 27]
[ 28 29 30 31]
[ 32 33 34 35]]]
书中已经介绍了6种基本函数和它们的代码演示:
- 使用sort函数进行排序
- 使用argsort函数进行排序
- 使用argmax和argmin函数进行搜索
- 使用where函数无x与y
- 使用where函数有x与y
- 使用extract函数进行搜索
其中注意argsort函数使用的方法类似于sort,只是返回的值不同,返回的是ndarray arr的下标。
Numpy的char模块提供的字符串操作函数可以运用向量化运算来处理整个ndarray,而完成同样的任务,Python的列表则通常借助循环语句遍历列表,并对逐个元素进行相应的处理。
ufunc,全称通用函数(universal function),是一种能够对ndarray中所有元素进行操作的函数,而不是对ndarray对象操作。
- ufunc的广播机制
常用的ufunc运算有算数运算、三角函数、集合运算、比较运算、逻辑运算和统计计算等。书上提供了若干种常用函数,对ndarray中所有元素的运算来说,在提供了极其方便与快捷的同时,又囊括一切强大的功能。相关函数及案例在书上第161页有详细演示,此处不再赘述。
04 matrix与线性代数
只要是大学期间学过《线性代数》这门课程的同学,对于《Python 3智能数据分析快速入门》的学习完全没有问题,相关专业术语及技术实现细节在本节中都有强调。详情请从第169页开始学习。
05 Numpy文件读写
但是在实际的数据分析任务中,更多使用文本格式的数据,如txt或csv,因此经常使用loadtxt函数执行对文本格式的数据的读取任务和savetxt函数执行对文本格式的数据的存储任务。
a.tofile(frame, sep='', format='%s')
- frame:文件、字符串
- sep:数据分割字符串,如果是空串,写入文件为二进制
- format:写入数据的格式
需要注意的是,该方法需要读取时知道存入文件时数组的维度和元素类型,a.tofile()和np.fromfile()需要配合使用,可以通过元数据文件来存储额外信息。
06 小结
参考文献:
2.中国大学MOOC,《Python数据分析与展示》作者:嵩天 。
4.CSDN:《花式索引与np.ix_函数》TzeSing 著
关于作者:王皓,一名就读于北京石油化工学院大数据管理与应用专业的同学,热爱并致力于学习Python语言及相关应用领域。大数据DT内容合伙人。
延伸阅读《Python3智能数据分析快速入门》
推荐语:本书假设你有一定的数据分析基础,但是没有Python和AI基础,为了帮助你快速掌握智能数据分析需要的技术和方法,书中有针对性地讲解了Python和AI中必须要掌握的知识点,内容由浅入深,循序渐进。从环境配置、基本语法、基础函数到第三方库的安装与使用,对各个操作步骤、函数、工具、代码示例等的讲解非常详尽,确保所有满足条件的读者都能快速入门。
