Numpy快速入门教程(一)数组操作

Numpy快速入门笔记(一)数组操作

学习网站

numpy 官网文档
源代码
菜鸟教程

学习目的及其背景

在很多时候在学习python+opencv的源码中,会调用很多关于numpy的库函数,不能每次都去查每个库函数的功能,所以在进行opencv的学习之前,学习一下python的基础和numpy库函数也是十分必要的,将一些常用的,有难点的知识记录下来也是十分有必要的,而不用去全部的看完所有的教程,下面进入到学习内容:

Numpy的功能作用

支持维度数组与矩阵运算,提供运行速度非常快的数学库。主要包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能
Numpy常用函数
生成数组函数:
# 创建数组
numpy.zeros(shape, dtype = float, order = 'C') # 创建指定大小的数组,数组元素以 0 来填充:
# shape	数组形状
# dtype	数据类型,可选
# order 'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组
-----------------------------------------------------------------------------------------------
# asarray 从数组到数组  参数说明参见创建数组中的说明
numpy.asarray(a, dtype = None, order = None)
# eg:
x =  [1,2,3] 
a = np.asarray(x)
-----------------------------------------------------------------------------------------------
# frombuffer 接受 buffer 输入参数,以流的形式读入转化成 ndarray 对象。
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
# count  	读取的数据数量,默认为-1,读取所有数据。
# offset	读取的起始位置,默认为0。
#**注意:buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。**
s =  b'Hello World' 
a = np.frombuffer(s, dtype =  'S1')  
-----------------------------------------------------------------------------------------------
numpy.fromiter(iterable, dtype, count=-1) #(跳过)
-----------------------------------------------------------------------------------------------
# 从数值范围创建数组
numpy.arange(start, stop, step, dtype)
# start	起始值,默认为0
# stop	终止值(不包含)
# step	步长,默认为1
# dtype	返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
-----------------------------------------------------------------------------------------------
# numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
# num	    要生成的等步长的样本数量,默认为50
# endpoint	该值为 true 时,数列中包含stop值,反之不包含,默认是True。
# retstep	如果为 True 时,生成的数组中会显示间距,反之不显示。
-----------------------------------------------------------------------------------------------
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) # (跳过)
-----------------------------------------------------------------------------------------------
数组切片和索引
a = np.arange(10)
s = slice(2,7,2) # start, stop 及 step 参数
b = a[s]    
c = a[2:7:2] 
# b和c相等 都是切片操作,将原数组切割成一个新的数组
-----------------------------------------------------------------------------------------------
print (a[...,1])   # 第2列元素
print (a[1,...])   # 第2行元素
print (a[...,1:])  # 第2列及剩下的所有元素 
-----------------------------------------------------------------------------------------------
# 数组索引
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
-----------------------------------------------------------------------------------------------
# 布尔索引
x = np.array([[  6,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print (x[x >  5])
-----------------------------------------------------------------------------------------------
数组广播(跳过原因:原理性性质的理解)
数组遍历(迭代)
a = np.arange(6).reshape(2,3)
for x in np.nditer(a):
    print (x, end=", " )
-----------------------------------------------------------------------------------------------
for x in np.nditer(a.T.copy(order='C')):
    print (x, end=", " )
# 访问顺序是一致的,只是a.T.copy(order = 'C')存储方式是不一样的,默认是按行访问
-----------------------------------------------------------------------------------------------
# 修改遍历的顺序
for x in np.nditer(a, order='F'):# Fortran order,即是列序优先;
for x in np.nditer(a.T, order='C'):# C order,即是行序优先;
-----------------------------------------------------------------------------------------------
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
for x in np.nditer(a, op_flags=['readwrite']): 
    x[...]=2*x # x=2*x  修改不成功 没有找到解答
# nditer 对象有另一个可选参数 op_flags。 默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了
# 在遍历数组的同时,实现对数组元素值得修改,必须指定 read-write 或者 write-only 的模式。
-----------------------------------------------------------------------------------------------
# 使用外部循环
for x in np.nditer(a, flags =  ['external_loop'], order =  'F'):  
   print (x, end=", " )
# _index	    可以跟踪 C 顺序的索引
# f_index	    可以跟踪 Fortran 顺序的索引
# multi-index	每次迭代可以跟踪一种索引类型
# external_loop	给出的值是具有多个值的一维数组,而不是零维数组
-----------------------------------------------------------------------------------------------
# 广播迭代(跳过)
数组操作
修改数组形状
函数描述
reshape不改变数据的条件下修改形状(维度的改变)
flat数组元素迭代器
flatten返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel返回展开数组
a = np.arange(9).reshape(3,3) 
a.flatten(order = 'F')
a.ravel(order = 'F')
翻转数组
函数描述
transpose对换数组的维度
ndarray.Tself.transpose() 相同
rollaxis向后滚动指定的轴
swapaxes对换数组的两个轴
b = np.transpose(a)
b = a.T
-----------------------------------------------------------------------------------------------
numpy.rollaxis(arr, axis, start)
# arr:数组
# axis:要向后滚动的轴,其它轴的相对位置不会改变
# start:默认为零,表示完整的滚动。会滚动到特定位置。
-----------------------------------------------------------------------------------------------
numpy.swapaxes(arr, axis1, axis2)
# arr:输入的数组
# axis1:对应第一个轴的整数
# axis2:对应第二个轴的整数
修改数组维度
维度描述
broadcast产生模仿广播的对象
broadcast_to将数组广播到新形状
expand_dims扩展数组的形状
squeeze从数组的形状中删除一维条目
连接数组
函数描述
concatenate连接沿现有轴的数组序列
stack沿着新的轴加入一系列数组。
hstack水平堆叠序列中的数组(列方向)
vstack竖直堆叠序列中的数组(行方向)
分割数组
函数数组及操作
split将一个数组分割为多个子数组
hsplit将一个数组水平分割为多个子数组(按列)
vsplit将一个数组垂直分割为多个子数组(按行)
数组元素的添加与删除
函数元素及描述
resize返回指定形状的新数组
append将值添加到数组末尾
insert沿指定轴将值插入到指定下标之前
delete删掉某个轴的子数组,并返回删除后的新数组
unique查找数组内的唯一元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值