NumPy 学习笔记一

本文是关于NumPy的学习笔记,详细介绍了NumPy的数组对象、多维数组创建、数值类型以及处理数组形状的方法,包括reshape、resize、flatten、ravel、堆叠数组和拆分数组等操作。内容源自《python数据分析》一书。

笔记来源:python数据分析【Ivan Idris著, 韩波译】

一、NumPy数组对象

NumPy中的多维数组称为ndarray,其主要有两个部分组成

1.数据本身

2.描述数据的元数据

在数组的处理过程中,原始信息不受影响,变化只是元数据而已

np.arange()函数可以产生数组,主要用来存放一组数值的一维数组,而ndarray则可以产生具有一个及以上的维度.

向量(一维NumPy数组)的创建与及向量形状

import numpy as np
a = np.arange(5)
print(a)                 # array([0, 1, 2, 3, 4])
print(a.shape)           # (5,)

上述向量有5个元素,数值分别是0-4,该数组的shape属性是一个元组(单元素元组),存放的是数组在每一个维度的长度。

二、创建多维数组

import numpy as np
m = np.array([arange(2),arange(2)])
print(m) 
                    #  array([0, 1],
                    #        [0, 1]])

print(m.shape)      # (2, 2) 

在上述代码中,使用了array()函数创建数组时,需要传递一个对象,这个对象就是小括号里的内容,其内容必须为数组类型,如这里为列表形式,即两个数组组成的一个列表,该对象是array()函数唯一所需要的参数,其还可以有很多可选参数,并且这些参数都带有预定义的缺省选项

三、NumPy的数值类型

(1)对于科学计算来说,python里支持的整型、浮点型、复数型还不够,仍然需要更多的数据类型,以下为NumPy的各种数值类型

类型说明
bool布尔型 (True or False) 占用1bit
inti

长度取决于平台整数(int32 或int64)

int8字节类型  ( -2^7    ~   2^7-1)
int16整型         (-2^15   ~   2^15-1)
int32整型         (-2^31   ~   2^31-1)
int64整型           ( -2^63   ~   2^63-1)
uint8无符号整型 ( 0  ~  2^8-1 )

uint16

无符号整型 ( 0  ~  2^16-1 )
uint32无符号整型 ( 0  ~  2^32-1 )
uint64无符号整型 ( 0  ~  2^64-1 )
float16

半精度浮点型

【符号为占1bit、指数占5bit、尾数占10bit】

float32

单精度浮点型 

【符号为占1bit、指数占8bit、尾数占23bit】

float64或者float

双精度浮点型 

【符号为占1bit、指数占11bit、尾数占52bit】

complex64复数类型(两个32位浮点数(实部、虚部)表示)
complex128或者complex复数类型(两个64位浮点数(实部、虚部)表示)

谨记:不允许将复数类型转为整型、也不可将复数转为浮点数,但是可以将浮点数转换为复数

(2)字符码

类型

字符码
整型i
无符号整型u
单精度浮点型f
双精度浮点型d
布尔型b
复数型D
字符串S
万国码(unicode)U
空类型(Void)

V

 

相关介绍如下

import numpy as np

a = np.array(7, dtype='f')
# array(7., dtype=float32)


##### Dtype构造函数

## (1) 用python自带的常规浮点型
print(np.dtype(float))      # float64       

## (2) 用字符码规定单精度浮点数
print(np.dtype('f'))        # float32

## (3) 用字符码规定双精度浮点数
print(np.dtype('d'))        # float64

## (4)向dtype构造一个双字符码,其中字符表示数据类型,第二个字符为数字(2,4,8分别对应16、32、64位)
print(np.dtype('f2'))       # float16
print(np.dtype('f4'))       # float32
print(np.dtype('f8'))       # float64


#####  dtype属性
t = np.dtype('Float64')
print(t.char)               # 'd'      #即 dtype的属性获取某种数据类型(字符)对应的是字符码

 

四、处理数组形状

(1)reshape() 与 resize()

其中:resize() 无返回值,但对原数组进行了改变。

而reshape() 有返回值,返回的值即为修改后的参数,但是不改变原来的数组。如下图所示

由上图可知,a.reshape()有返回值,但是不影响原数组a,但是通过a.resize()后无返回值,但是再次查看原数组a时,已经发生了变化。

(2) flatten() 与 ravel() 

相同: 均有返回值,而且返回值均为对原数组拉伸为一维的数组形式。并且此时对原数组不影响。如下所示

不同:1)flatten()函数返回的是真实的数组,即新的数组,需要分配新的内存空间。对flatten()后的数组进行变化后,不会影响原来未flatten()前的数组。即如下所示

如上图所示,b是a先通过flatten()后的数组,占据一个新的内存空间,不同于原数组a,所以对flatten()后的数组(即b)进行改变,即对其全部元素变为1【即b[...]=1】,则只有b变化了,而原来没有flatten()前的数组a并未发生改变。

2)ravel()函数返回的是一个视图,让其为c,而非一个新的空间,与原数组有关,如果对该视图进行改变,让其所有元素变为1,即【c[...]=1】,则c,即视图发生变化,因为视图也与原数组相关,所有,原数组a也发生改变。如下图所示

(3)堆叠数组

1) 水平叠加【  hstack()函数    或  concatenate((x,x),axis=1) 】

hstack()函数

也可以通过以concatente()函数实现【其中记住 axis =1表示水平叠加】

水平叠加过程可以表示如下图所示

2)列式堆叠【column_stack()函数】

对一维数组进行列式堆叠时,每个一维数组即为一个列,对每个列进行水平叠加【与水平堆叠不同】示例如下图所示

当对二维数组进行列式堆叠时,过程与hstack()

3) 垂直叠加 【  vstack()函数    或  concatenate((x,x),axis=0) 】

也可以通过以concatente()函数实现【其中记住 axis =0表示垂直叠加】

垂直叠加过程可以表示如下图所示

4)行式堆叠【row_stack()函数】     在一、二维堆叠时与vstack()等价

对一维数组进行行式堆叠时,每个一维数组即为一个行,对每个行进行水平叠加【与水平堆叠相同】示例如下图所示

当对二维数组进行行式堆叠时,过程与vstack()也相同  

5)深度叠加【dstack()函数】 

这种方法需要沿着第三个坐标轴(纵向)的方向来叠加一摞数组,如,可在一个图像数据的二维数组上叠加另一幅图像的数据。如下所示

(4)拆分NumPy数组

【可以从横向、纵向、深度方向进行拆分,hsplit()、 vsplit() 、dsplit()、 split() 】

1) 横向拆分【hsplit() 类似水平堆叠 hstack() 的反过程 ,可以指定拆解的部分数,各部分一定均等、若不能均等,则不可拆分】

拆解结果如下图示

相当于调用参数axis=1split()函数

2) 纵向拆分【vsplit() 类似垂直堆叠 vstack() 的反过程 ,可以指定拆解的部分数,各部分为原数组的每个内部数组】

拆解结果如下图示

相当于调用参数axis=0split()函数

3) 深向拆分【dsplit() 类似垂直堆叠 dstack() 的反过程 ,可以指定拆解的部分数】,下图为秩为3的数组示例

(5)NumPy数组的属性

1) ndim属性存储维度数量

2)size属性存储整个数组的全部元素个数

3)itemsize属性返回数组中各个元素所占用的字节数【一般单纯的整型返回4,浮点型则为8】

4)nbytes返回存储整个数组所需要的字节数【nbytes 等价于 itemsize*size的值】

5)T属性与transpose()函数相同,即转置

6)复数的构建及实部虚部的提取

如果数组含有复数,其数据类型会自动变为复数类型

7) flat属性返回一个numpy.flatiter对象,是获取flatiter对象的唯一方法,但无法访问flatiter的构造函数,可使用flat的迭代器来遍历数组

获取flatiter对象、并可获取多个元素

对flat属性进行赋值,但这个值会覆盖整个数组的所有元素值。也可以对特定位置元素进行进行赋值

属性小结

(6)NumPy数组的转换

1) 将NumPy数组转换为python列表形式【tolist() 函数】

2) 将数组元素转换为指定类型【astype() 函数】

当complex类型转为int类型是,虚部被丢弃。此外,还需将数据类型名称以字符串形式'complex' 传递给astype()函数

参考:

[1]. Ivan Idris. 著;韩波译.python数据分析[M].北京:人民邮电出版社,2016.2.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值