Loading

Numpy基础

一、简介

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy 通常与 SciPy(计算扩展)和 Matplotlib(数据可视化)一起使用

SciPy 是一个开源的 Python 算法库和数学工具包,包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。

二、ndarray对象

NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。

ndarray 对象是用于存放同类型元素的多维数组。

ndarray 中的每个元素在内存中都有相同存储大小的区域。

ndarray 内部由以下内容组成:

  • 一个指向数据(内存或内存映射文件中的一块数据)的指针。

  • 数据类型或 dtype,描述在数组中的固定大小值的格子。

  • 一个表示数组形状(shape)的元组,表示各维度大小的元组。

  • 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。

语法

 numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0) 

参数说明:

名称描述
object 数组或嵌套的数列
dtype 数组元素的数据类型,可选
copy 对象是否需要复制,可选
order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok 默认返回一个与基类类型一致的数组
ndmin 指定生成数组的最小维度

创建一个普通的ndarray对象 

import numpy as np

a = np.array([1,2,3]) #创建一维数组
print("这是一维数组:",a)

b = np.array([[4,5,6],[7,8,9]]) #创建二维数组
print("这是二维数组:",b)

c = np.array([1,2,3,4,5],ndmin = 2) #指定最小维度
print("指定了最小维度:",c)

d = np.array([1,2,3],dtype = complex) #指定元素数据类型为复数
print("指定了元素数据类型为复数:",d)

三、numpy数据类型

numpy 支持的数据类型比 Python 内置的类型要多很多,其中部分类型对应为 Python 内置的类型。

bool_ 布尔型数据类型(True 或者 False)
int_ 默认的整数类型
intc 与 C 的 int 类型一样,一般是 int32 或 int 64
intp 用于索引的整数类型
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 对象的实例,并对应唯一的字符

数据类型对象 (dtype)
数据类型对象是用来描述与数组对应的内存区域如何使用,这依赖如下几个方面:
    数据的类型(整数,浮点数或者 Python 对象)
    数据的大小(例如, 整数使用多少个字节存储)
    数据的字节顺序(小端法或大端法)
    在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分
    如果数据类型是子数组,它的形状和数据类型
字节顺序是通过对数据类型预先设定"<"或">"来决定的。"<"意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。">"意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。
语法:
 numpy.dtype(object, align, copy) 
实例
import numpy as np
students = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) #创建结构化数据类型
b = np.array([('chancey',18,100),('chanceys',16,99)],dtype = students) #将数据应用于ndarray对象
print(b)

NumPy 数组的维数称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推。

在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。

比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。

很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。

NumPy 的数组中比较重要 ndarray 对象属性有:

属性说明
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

详解:

ndarray.ndim 返回数组的维数,等于秩

a = np.arange(24) #生成0-23的整数
print(a.ndim) #返回秩

ndarray.shape 返回维度,以元组的形式返回,分别是它的行和列  

a = np.array([[1,2,3],[4,5,6]])
print(a.shape)
#此外,a.shape还可以用来修改维度
a.shape = (1,6)
print(a)
#Numpy用reshape专门用来修改维度
b = a.reshape(3,2)
print(b)

ndarray.itemsize 以字节的形式返回数组中每一个元素的大小

x = np.array([1,2,3,4], dtype = 'int64') #int64就是占用64个bits,而每个字节的长度固定为8,所以x的itemsize的值为64/8=8
print(x.itemsize)

ndarray.flags 返回内存地址

>>> import numpy as np
>>> x = np.array([1,2,3])
>>> print(x.flags)
  C_CONTIGUOUS : True #数据是在一个单一的C风格的连续段中
  F_CONTIGUOUS : True #数据是在一个单一的Fortran风格的连续段中
  OWNDATA : True #数组拥有它所使用的内存或从另一个对象中借用它
  WRITEABLE : True #数据区域可以被写入,将该值设置为 False,则数据为只读
  ALIGNED : True #数据和所有元素都适当地对齐到硬件上
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False #这个数组是其它数组的一个副本,当这个数组被释放时,原数组的内容将被更新

 

posted @ 2019-01-24 14:42  ChanceySolo  阅读(164)  评论(0)    收藏  举报