目录
- 一、Numpy 介绍
- 二、NumPy 的应用
- 学习链接
- 三、Numpy 中的 Ndarray对象
- 1、ndarray 的内部结构
- 2、创建ndarray对象:
- 四、NumPy 数据类型
- 1、数据类型对象(dtype)
- 2、创建 dtype 对象
数据分析,作为大数据时下比较火的行业,想要转行从事相关工作的人很多很多,那么在工作中绝对绕不过的三个包是
numpy、scipy和pandas。numpy是Python的数值计算扩展,专门用来处理矩阵,它的运算效率比列表更高效。scipy是基于numpy的科学计算包,包括统计、线性代数等工具。pandas是基于numpy的数据分析工具,能更方便的操作大型数据集,那么什么是numpy呢?它又是如何使用的呢?
一、Numpy 介绍
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
NumPy 是一个运行速度非常快的数学库,主要用于数组的计算,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
二、NumPy 的应用
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。
SciPy 是一个开源的 Python 算法库和数学工具包。
SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。
学习链接
- NumPy 官网 http://www.numpy.org/
- NumPy 源代码:https://github.com/numpy/numpy
- SciPy 官网:https://www.scipy.org/
- SciPy 源代码:https://github.com/scipy/scipy
- Matplotlib 官网:https://matplotlib.org/
- Matplotlib 源代码:https://github.com/matplotlib/matplotlib
三、Numpy 中的 Ndarray对象
ndarray:他是一系列同类型数据的集合,以0位下标开始进行集合中元素的索引。
ndarray 对象是用于存放同类型元素的多维数组
ndarray 中每个元素在内存中都有相同存储大小的区域
ndarray 内部由以下内容组成:
- 一个指向数据(内存或内存映射文件中的一块数据)的指针。
- 数据类型或者dtype,描述在数组中的固定大小值的格子。
- 一个表示数组形状(shape)的元组,表示各维度大小的元组。
- 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要 “跨过” 的字节数。
1、ndarray 的内部结构
其中的跨度可以是负数,这样会使数组在内存中向后移动,比如切片obj[ : :-1]
或者 obj[:, :: -1]
就是如此。
2、创建ndarray对象:
import numpy as np
np.array(object, dtype = None, copy = True, order = None, subok = Fasle, ndmin = 0)
参数说明:
名称 | 描述 |
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
实例:
import numpy as np
#eg_1 单维度
a = np.array([1, 2, 3])
print(a)
#结果为 : [1,2,3]
#eg_2 多维度
a = np.array([[1, 2], [3, 4]])
print(a)
'''
结果为:[[1,2]
3,4]]
'''
#eg_3 最小维度
a = np.array([1, 2, 3, 4, 5], ndmin = 2)
print(a)
'''
结果为: [[1, 2, ]] 指定为2个维度
'''
#eg_4 dtype参数
a = np.array([1, 2, 3], dtype = complex)
print(a)
'''
结果为:[1. + 0.j, 2. + 0j, 3. + 0j]
'''
ndarray 对象是由计算机内存的连续一维部分组成,并结合索引模式,将每个元素映射到内存块中的一个位置。内存块以行顺序或者列顺序来保存元素。
四、NumPy 数据类型
numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型。
常用 NumPy 基本类型
名称 | 描述 |
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
NumPy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等
1、数据类型对象(dtype)
数据类型对象是用来描述与数组对应的内存区域如何使用,这依赖如下几个方面:
- 数据的类型(整数、浮点数、或者Python对象)
- 数据的大小(例如 整数使用了多少个字节存储)
- 数据的字节顺序(小端法或大端法)
- 在结构化类型的情况下,字段的名称、对每个字段的数据类型和每个字段所取的内存块的部分
- 如果数据类型是子数组,它的形状和数据类型字节顺序是通过数据类型预先设定 ’ < ‘ 或者 ’ > ’ 来决定的。
- ’ < ‘ 意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。
- ’ > '意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。
2、创建 dtype 对象
import numpy as np
np.dtype(obiect, align, copy)
参数说明:
名称 | 描述 |
object | 要转换为的数据类型对象 |
align | 如果为True,填充字段使其类似C的结构体 |
copy | 复制dtype对象,如果为False,则是对内置数据类型对象的引用 |
实例:
import numpy as np
#eg_1 使用标量类型
dt = np.dtype(np.int32)
print(dt)
'''
输出结果为: int32
'''
#eg_2
'''
四种数据类型可以使用字符串来代替:
int8, int16, int32, int64
'i1', 'i2', 'i4', 'i8'
'''
dt = np.dtype('i4')
print(dt)
'''
输出结果为:int32
'''
#eg_3 字节顺序标注
dt = np.dtype('<i4')
print(dt)
'''
输出结果为:int32
'''
#eg_4 下面的例子展示结构化数据类型的使用,类型字段和对应的实际类型将被创建
#创建结构化数据类型
dt = np.dtype([('age',np.int32)])
print(dt)
'''
输出结果为:[('age', 'i1')]
'''
#将数据类型应用于 ndarray 对象
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print(a)
'''
输出结果为:([(10,), (20,), (30,)]
'''
# 类型字段名可以用于存取实际的 age 列
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print(a)
print(a['age'])
'''
输出结果为:[(10,) (20,) (30,)]
[10 20 30]
'''
#eg_5 该实例将定义一个结构化类型 student, 包含字符串字段 name, 整数字段 age,以及浮点数字段 marks,并将这个 dtype 应用到 ndarray 对象
student = np.dtype([('name','S20'),('age','i1'),('marks','f4')])
print(student)
'''
输出结果为:[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]
'''
每一个内建类型内部都有一个唯一定义它的字符代码:
字符 | 对应类型 |
b | 布尔型 |
i | (有符号) 整型 |
u | 无符号整型 integer |
f | 浮点型 |
c | 复数浮点型 |
m | timedelta(时间间隔) |
M | datetime(日期时间) |
O | (Python) 对象 |
S, a | (byte-)字符串 |
U | Unicode |
V | 原始数据 (void) |
希望本文对初学者有所帮助,本文将持续更新,在后面各位读者将会看到更多Numpy应用,以及Python数据分析的三剑客之二 潘大师(pandas) 的出现,如果错误或不足之处,还请各位读者指出,感谢阅读!