博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Numpy 库

Posted on 2020-09-02 12:10  leonsusie  阅读(355)  评论(0)    收藏  举报

#python 3.8.5

#numpy-1.19.1

Numpy库官网:https://numpy.org/,可以查到关于该库的很多东西。

如果要学习Numpy基础知识,建议学习MOOC的高嵩老师的《Python数据分析与展示课程》

 

1.一些基本概念

1.1.数据的维度:

1.1.1一维数据:

  一维数据由一组关系对等的有序或无序数据构成,采用线性方式组织,对应编程语言中的 列表(list),数组(python没有自带数组),集合(set)等

  列表、数组:一组数据的有序结构(即可以通过下标找到相应的数据),元素可以重复。集合是无序的,元素不能重复。

  列表和数组的区别:

    列表的每个元素类型可以不一样

    列表:list[123,'a',3.14,[1,2,3]],元素包括整型,字符串,浮点型,列表类型

  数组:array[123,2,4,5] 元素只有整型

1.1.2 二维数据:

  二维数据由多个一维数据构成,是一维数据的组合形式。

  表格是二维数据的一种典型,其中表头也是二维数据的一部分

1.1.3 多维数据:

  多维数据由一维和二维数据,在新维度上的扩展形成。

1.1.4高维数据

   高维数据仅利用基本的二元关系展示数据间复杂的关系,比如

  {‘first name’:'Tom',

  'last name' : 'Jerry',

  'address':{

  'street' :'xxxx',

  'zip':'123456'

  'city':'Beijing'

  },

  'prof':['aaaa','bbbbbb']

  }

1.1.5 数据维度的python表示

 一维数据:列表,集合

二维数据:列表(多维列表)

高维数据:字典或数据表示格式(JSON,XML)

 

 2.Numpy库介绍

  Numpy是一个开源的科学计算基础库

  一个强大的多维对象ndarray(底层是C语言,这样数组间的计算就非常快,要求数组维度相同)

  广播功能函数

  整合C/C++/Fortran 代码工具

  线性代数,傅里叶变换,随机数生成等功能

   Numpy是Pandas,Scipy等数据处理的或科学计算库的基础

2.1 Numpy引用

#先安装numpy,在操作系统控制台(win+R,  输入cmd)
pip install numpy

#引用
import numpy as np #一般约定用np作为别名

 2.2. ndarray (别名array)

ndarray是一个多维数组对象,由两部分构成:
• 实际的数据
• 描述这些数据的元数据(数据维度、数据类型等)

ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始

 

array=np.array([0,1,2,3,4],[5,6,7,8,9])  #生成一个ndarray数组对象,用了ndarray别名array
print(array)

输出结果:[0 1 2 3 4] [5 6 7 8 9]       np.array()输出成[]形式,元素由空格分割

轴(axis): 保存数据的维度;秩(rank):轴的数量

ndarray基本属性

import numpy as np
array=np.array([0,1,2,3,4],[5,6,7,8,9])

 

属性 参数 类型 具体值 实例 返回值
.ndim 秩,即轴的数量或维度的数量   int  表示轴的数量 array.ndim 2
 .shape  ndarray对象的尺度,对于矩阵,n行m列  元组类型  (3,2)表示3行2列 array.shape (2,5)
 .size  ndarray对象元素的个数,相当于.shape中n*m的值  int  6,表示有6个元素 array.size 10
 .dtype   ndarray对象的元素类型  string  int32,表示int32类型 array.dtype int32
 .itemsize   ndarray对象中每个元素的大小,以字节为单位  string 表示元素大小(字节单位) array.itemsize 4
.data

原始文档是这么说的:

the buffer containing the actual elements of the array. Normally, we won’t need to use this attribute because wewill access the elements in an array using indexing facilities.

       

 

数据类型说明(1)
bool 布尔类型,True或False
intc 与C语言中的int类型一致,一般是int32或int64
intp 用于索引的整数,与C语言中ssize_t一致,int32或int64
int8 字节长度的整数,取值:[‐128, 127]
int16 16位长度的整数,取值:[‐32768, 32767]
int32 32位长度的整数,取值:[‐231, 231‐1]
int64 64位长度的整数,取值:[‐263, 263‐1]

 

ndarray的元素类型(2)
uint8 8位无符号整数,取值:[0, 255]
uint16 16位无符号整数,取值:[0, 65535]
uint32 32位无符号整数,取值:[0, 232‐1]
uint64 32位无符号整数,取值:[0, 264‐1]
float16 16位半精度浮点数:1位符号位,5位指数,10位尾数
float32 32位半精度浮点数:1位符号位,8位指数,23位尾数
float64 64位半精度浮点数:1位符号位,11位指数,52位尾数

ndarray的元素类型(3)

complex64 复数类型,实部和虚部都是32位浮点数
complex128 复数类型,实部和虚部都是64位浮点数


ndarray为什么要支持这么多种元素类型?
对比:Python语法仅支持整数、浮点数和复数3种类型
• 科学计算涉及数据较多,对存储和性能都有较高要求
• 对元素类型精细定义,有助于NumPy合理使用存储空间并优化性能
• 对元素类型精细定义,有助于程序员对程序规模有合理评估

ndarray数组可以由非同质对象构成

a=np.array([[1,2,3,4,5],[1,2,3]])

 非同质ndarray元素为对象类型为object

非同质ndarray对象无法有效发挥NumPy优势,尽量避免使用

 

3 ndarray数组的创建方法
• 从Python中的列表、元组等类型创建ndarray数组
• 使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等
• 从字节流(raw bytes)中创建ndarray数组
• 从文件中读取特定格式,创建ndarray数组


3.1 从Python中的列表、元组等类型创建ndarray数组

x = np.array(list/tuple, dtype=np.float32)

当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型

x = np.array([1,2,3]) #列表创建
x = np.array((1,2,3)) #元组创建
x = np.array([[1,2,3],(4,5,6)])  #列表,元组混合创建,但是列表元素和元组元素个数需要相同


3.2 使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等

函数

说明 实例 结果
np.arange(n) 类似range()函数,返回ndarray类型,元素从0到n‐1 np.arange(3) [1 2 3]
np.ones(shape) 根据shape生成一个全1数组,shape是元组类型 np.ones((2,2))

[[1 1]

[1 1]]

np.zeros(shape) 根据shape生成一个全0数组,shape是元组类型 np.zeros((2,2))

[[0 0]

[0 0]]

np.full(shape,val) 根据shape生成一个数组,每个元素值都是val np.full((3,2),2)

[[2 2]

[2 2]

[2 2]]

np.eye(n) 创建一个正方的n*n单位矩阵,对角线为1,其余为0 np.eye(3)

[[1 0 0]

[0 1 0]

[0 0 1]]

np.empty() 创建一组随机数,float64类型 np.empty((m,n))  
np.ones_like(a) 根据数组a的形状生成一个全1数组    
np.zeros_like(a) 根据数组a的形状生成一个全0数组    
np.full_like(a,val) 根据数组a的形状生成一个数组,每个元素值都是val    
np.linspace()

1.根据起止数据等间距地填充数据,形成数组

(元素默认是浮点型)

np.linspace(start,end,count)

start=起始值

end=结束值

count=数组个数

np.linspace(1,10,4) [1. 4. 7. 10.]

2. np.linspace(start,end,count,endpoint=False)

endpoint=False 表示结束值不在数组内

np.linspace(1,10,4,endpoint=False)  [1. 3.25 5.5 7.75]
np.concatenate() 将两个或多个数组合并成一个新的数组

a=np.array([1,2,3])

b=np.array([4,5,6])

c=np.concatenate(a,b)

 [1 2 3 4 5 6]

4 ndarray数组的变换

 

函数

说明 实例 结果
.reshape(shape)

.reshape(shape) 不改变数组元素

返回一个shape形状的数组

原数组不变

a=np.array([[1,2,3],[4,5,6]])

b=a.reshape((3,2))

b=

[[1 2]

[3 4]

[5 6]]

 .resize(shape)  与.reshape()功能一致,但修改原数组

a=np.array([[1,2,3],[4,5,6]])

a.resize((3,2))

 

a=

[[1 2]

[3 4]

[5 6]]
 .swapaxes(ax1,ax2)

将数组n个维度中两个维度进行调换

原数组不变

f=np.ones((3,2))
h=f.swapaxes(0,1) #调换维度

将第0轴,与第1轴互换

轴标从0开始

 

 h=

[[1. 1.]
 [1. 1.]
 [1. 1.]]

 .flatten()

 对数组进行降维,返回折叠后的一维数组

原数组不变

d=np.ones((3,5))
e=d.flatten()
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

5 ndarray数组的类型变换

new_a = a.astype(new_type)

实例:
a=np.ones((2,2))
b=a.astype(np.float)

b=[[1. 1.] [1. 1.]]

 

6 ndarray数组向列表的转换

ls = a.tolist()

实例:
a=np.full((2,2),25,dtype=np.int32)
b=a.tolist()

b:[[25,25],[25,25]]

7 ndarray数组的索引和切片

索引:获取数组中特定位置元素的过程(一维数组的索引和切片:与Python的列表类似)
切片:获取数组元素子集的过程

 

a=np.array([1,2,3,4,5,6,7,8,9])

#索引
a[2]=3

#切片
b=a[1:4:2] #[起始编号: 终止编号(不含): 步长,3元素冒号分割]
b:[2 4]

 

多维数组的索引

 

 

多维数组的切片:

 

 

 

 

 

8 ndarray数组的运算


数组与标量之间的运算作用于数组的每一个元素

 

 


 一元函数

函数 说明

 


 np.abs(x) np.fabs(x)  计算数组各元素的绝对值    
 np.sqrt(x)  计算数组各元素的平方根    
np.square(x) 计算数组各元素的平方    
np.log(x) np.log10(x)
np.log2(x)
计算数组各元素的自然对数、10底对数和2底对数    
np.ceil(x) np.floor(x) 计算数组各元素的ceiling值或floor值    
 np.rint(x)  计算数组各元素的四舍五入值    
 np.modf(x)  将数组各元素的小数和整数部分以两个独立数组形式返回    
np.cos(x) np.cosh(x)
np.sin(x) np.sinh(x)
np.tan(x) np.tanh(x)
计算数组各元素的普通型和双曲型三角函数    
np.exp(x) 计算数组各元素的指数值    
np.sign(x) 计算数组各元素的符号值,1(+), 0, ‐1(‐)    
       

  二元函数

函数 说明    
 + ‐ * / ** 两个数组各元素进行对应运算     
np.maximum(x,y) np.fmax()
np.minimum(x,y) np.fmin()
元素级的最大值/最小值计算    
np.mod(x,y) 元素级的模运算    
np.copysign(x,y) 将数组y中各元素值的符号赋值给数组x对应元素    
> < >= <= == != 算术比较,产生布尔型数组    

 实例

 

 数组间运算

       

A=np.array( [[1,1],[0,1]] )

B=np.array( [[2,0],[3,4]] )

     

A*B 

array([[2, 0],[0, 4]])    

A@B

array([[5, 4],[3, 4]])    

A.dot(B)

array([[5, 4],[3, 4]])    

A+B

array([[3,2],[3, 5]])    

注意:

手册中有这么一句话:如果两个数组的元素类型不一样

结果的数组精度比运算数组精度要高就没问题

如果结果的数组精度比运算数组精度低,就会报错

When operating with arrays of different types

the type of the resulting array corresponds to the more general or preciseone

(a behavior known as upcasting).

     

9. CSV 文件存取

存放

1 np.savetxt(frame, array, fmt='%.18e', delimiter=None)

• frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
• array : 存入文件的数组
• fmt : 写入文件的格式,例如:%d %.2f %.18e
• delimiter : 分割字符串,默认是任何空格

读取

1 np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)

• frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
• dtype : 数据类型,可选
• delimiter : 分割字符串,默认是任何空格
• unpack : 如果True,读入属性将分别写入不同变量

CSV只能有效存储一维和二维数组

 

多维数据的存取

1 a.tofile(frame, sep='', format='%s')

• frame : 文件、字符串
• sep : 数据分割字符串,如果是空串,写入文件为二进制
• format : 写入数据的格式

np.savetxt() np.loadtxt()只能有效存取一维和二维数组

sssssssssssssssssss
• frame : 文件、字符串
• dtype : 读取的数据类型
• count : 读入元素个数,‐1表示读入整个文件
• sep : 数据分割字符串,如果是空串,写入文件为二进制

 

1 np.save(fname, array) 或np.savez(fname, array)

• fname : 文件名,以.npy为扩展名,压缩扩展名为.npz
• array : 数组变量
np.load(fname)
• fname : 文件名,以.npy为扩展名,压缩扩展名为.npz

 

10.NumPy的random子库

函数 说明 实例  
rand(d0,d1,..,dn) 根据d0‐dn创建随机数数组,浮点数,[0,1),均匀分布 a=np.random.rand(2,3)  
randn(d0,d1,..,dn) 根据d0‐dn创建随机数数组,标准正态分布    
randint(low[,high,shape])

根据shape创建随机整数或整数数组,范围是[low, high)

randint(low) 产生一个不超过Low的随机整数

randint(low,high),产生一个随机整数范围是[low, high)

c=np.random.randint(2,10,(2,2)) 数据为整型
seed(s) 随机数种子,s是给定的种子值

c=np.random.seed(n)

种子相同,随机数产生页会相同

 

 

 

函数 说明 实例  
shuffle(a) 根据数组a的第1轴进行随排列,改变数组x np.random.shuffle(a)  a会变更
permutation(a) 根据数组a的第1轴产生一个新的乱序数组,不改变数组x b=np.random.permutation(a) a不会变更
choice(a[,size,replace,p]) 从一维数组a中以概率p抽取元素,形成size形状新数组
replace表示是否可以重用元素,默认为False
   

 

 

函数 说明 实例  
uniform(low,high,size) 产生具有均匀分布的数组,low起始值,high结束值,size形状 np.random.uniform(low,high,size)  数据为浮点型
normal(loc,scale,size) 产生具有正态分布的数组,loc均值,scale标准差,size形状   数据为浮点型
poisson(lam,size) 产生具有泊松分布的数组,lam随机事件发生率,size形状    

11. NumPy直接提供的统计类函数

 

函数 说明 实例  
sum(a, axis=None) 根据给定轴axis计算数组a相关元素之和,axis整数或元组    
mean(a, axis=None) 根据给定轴axis计算数组a相关元素的期望,axis整数或元组    
average(a,axis=None,weights=None) 根据给定轴axis计算数组a相关元素的加权平均值    
std(a, axis=None) 根据给定轴axis计算数组a相关元素的标准差    
var(a, axis=None) 根据给定轴axis计算数组a相关元素的方差    
min(a) max(a) 计算数组a中元素的最小值、最大值    
argmin(a) argmax(a) 计算数组a中元素最小值、最大值的降一维后下标    
unravel_index(index, shape) 根据shape将一维下标index转换成多维下标    
ptp(a) 计算数组a中元素最大值与最小值的差    
median(a) 计算数组a中元素的中位数(中值)    
       

 

12.梯度函数

 

函数 说明    
 np.gradient(f)  计算数组f中元素的梯度,当f为多维时,返回每个维度梯度

梯度:连续值之间的变化率,即斜率
XY坐标轴连续三个X坐标对应的Y轴值:a, b, c,

其中,b的梯度是: (c‐a)/2

 
 

b=np.random.randn(0,20,(5))

[15,3,12,13,14]

np.gradient(b)

[-12,-1.5,5.,1.,1.]

存在两侧值:(右侧-左侧)/2:(12‐15)/2

只有一侧值:(右边的-左边的)/1 :(14‐13)/1