文章目录
1.Numpy入门
1.综述
生活中的多种数据,都可以看成是数字数组:
- 图像(尤其是灰度图像)可以看成是二维数字数组,每个位置数字代表该像素的灰度值
对于彩色图像的,可以分解红色灰度图像,绿色灰度图像,蓝色灰度图像三个灰色图像的叠加. - 声音片段可以看成时间和强度的一维数组
- 文本也可以通过各种方式转换成数组表示
因此,有效地储存和操作数值数组是数据科学中绝对的基础过程
Python中,我们一般用两个专门的工具来高效的处理这些数值数组:Numpy和Pandas
这里将主要介绍Numpy(Numerical Python)
Numpy提供了高效存储和操作密级数据缓存的接口.
在某些方面,Numpy数组和Python内置的列表非常相似,但是随着数组在维度上的增加,Numpy的数字提供了更加高效的储存和数据操作.
Numpy几乎就是Python数据科学工具生态系统的核心.
本章就将讲解Numpy入门所需要的具备的一些知识
Numpy中和中操作将在下一章讲解:
- 理解Python中的数据类型
- Numpy中的数据类型
2.理解Python中的数据类型
我们如果想要实现高效的数据驱动科学和计算,需要理解数据是如何被储存和操作的,本节就将介绍在Python语言中
数据数组是如何被处理的,并对比Numpy所做的改进.
Python的易用性在很大程度上来源于他的变量是动态的,我们无需在给变量赋值之前声明变量的类型和给变量划分内存;但是对于C语言,我们每个变量的数据类型都必须被准确的声明.例如:
Python:
x=4
x='four'
>>>这样的操作是合法的,因为Python中的变量是动态的
C:
int x;
x="four"
>>>编译失败,这样的操作在C语言中是非法的
其实,Python这样的灵活性也指出了一个事实:
Python中的变量不仅是他们的值,还包括了关于值的类型的一些额外信息.
下面将来详细介绍.
Python中的变量不仅仅是它的值
标准的Python实现使用C语言编写的,这就意味着每一个Python对象都是一个聪明的伪C语言结构体
这个结构体不仅包含它的值,还包含其他信息.
例如,我们在Python中定义x=10000,x并不是一个原生的整型,他指向一个C语言的符合结构体
我们查看Python的源代码,能够看到整型(整型是一个对象)能够分成四部分:
struct_longobject{
long ob_refcent;
PyTypeObject*ob_type;
size_t ob_size;
long ob_digit[1];
}
即:
- ob_fefcnt:是一个引用计数,帮助Python处理内存的分配和回收
- ob_type:将变量的类型编码
- ob_size:指定接下来的数据成员的大小
- ob_digit:我们希望python变量表示的实际整型的值
因此,Python中的一个整型实际上包含两部分:
- PyObject_HEAD
- 实际储存的数据
这与C语言中很不同.
C语言整型本质上是对应某个内存位置的标签,里面储存的字节会编码成整型.
Python的整型实际上是一个指针,指向包含这个Python对象所有信息的某个内存位置.
因此Python的变量在重新赋值的时候,只需要改变PyObject_HEAD的信息,然后在改变指针即可.
正是由于Python变量包含描述部分(HEAD)和真实值,才实现了Python变量的灵活性.
但是当大量的相同数据集合在一起的时候,大量的PyObject_HEAD实际上造成了内存的开销.拉低了运行的速度(因为每个变量需要先解析PyObject_HEAD,在根据指针指向的地址取值)
Python中的列表不仅仅是项的值
根据前面的描述,我们很容易就能知道,为什么Python的列表具有异构性:
因为他的每一个项都包含各自的PyObject_HEAD,即每一项都是一个完整的Python对象.
因此如果一个列表中的数据都是同一个类型的话,Python中的原生列表就会浪费很多的内存和运行时间.
因此Numpy的数组就会要求所有的值都是同一个类型的,如果不是同一个类型的话,就会默认根据C语言的自动数据转换向上转换类型.
理解了Numpy列表和python列表的不同之处是很重要的.
因此也就不难理解为什么Numpy的数组需要声明数据类型
3.Numpy中的数据类型
Numpy中要求数据都是同一个类型的,所以在初始化数组的时候就经常需要声明变量的类型,
因此下面将介绍Numpy中的数据类型和声明
Numpy是基于C语言开发的,但是具有Python的API,因此Numpy的数据类型会和C语言比较类似.
Numpy的数据类型
数据类型 | 描述 |
---|---|
bool_ | 布尔值(真/假,True/False),用一个字节储存 |
int_ | 默认整形(类似于C语言中的long,但通常情况下是int32或int64) |
intc | 与C语言的int相同(通常是int32或int64) |
intp | 用作索引的整型(和C语言的ssize_t相同,通常情况下是int32或int64) |
int8 | 一字节 |
int16 | 整型,两字节 |
int32 | 整型,四字节 |
int64 | 整型,八字节 |
uint8 | 无符号整型 |
uint16 | 无符号整型 |
uint32 | 无符号整形 |
uint64 | 无符号整形 |
float_ | float64的简化形式 |
float16 | 半精度浮点数 |
float32 | 单精度浮点数 |
float64 | 双精度浮点数 |
complex_ | complex128的简化形式 |
complex64 | 复数,有两个32位浮点数表示 |
coomplex128 | 复数,由两个64位浮点数表示 |
其实Numpy还支持更多的数据类型,这里就不更多的列举了
Numpy的数据类型声明
Numpy中声明数据类型的方式有两种,一个是使用字符串参数来声明,还有一个是用Numpy对象.
np.zeros(10,dtype=‘int16’)
np.zeros(10,dtype=np.int16)