Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并


Posted in Python onAugust 28, 2019

1. 简介

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

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab。
SciPy 是一个开源的 Python 算法库和数学工具包。SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。

2. 创建

创建一维数组
(1)直接创建:np.array([1, 2, 3, 4, 5, 6])
(2)从python的list中建立:np.array(list([1, 2, 3, 4, 5, 6]))

 创建常量值的一维数据
(1)创建以0为常量值:np.zeros(n,dytpe=float/int)
(2)创建以1为常量值:np.ones(n)
(3)创建一个空数组:np.empty(4)

 创建一个元素递增的数组
(1)从0开始增长的递增数组:np.arange(8)
(2)给定区间,自定义步长:np.arange(0,1,0.2)
(3)给定区间,自定义个数:np.linspace(-1,1,50)

 创建多维数组:创建单维数组,再添加进多维数组

# 数组的结构一定是np.array([]) 无论数组中间存放的是多少“层”数据
# 二维数组相当于存放的是“两层”数组而已
arr1=np.array(list([1, 2, 3, 4, 5]))
arr2=np.array([arr1,[1,0,0,1,0]])  # 2*5的两维数组
arr3=np.array(list([[0,0,1,1,1],[1,1,1,0,0],[2,3,4,5,6]])) # 3*5的两维数组

arrx=np.array([arr1,list([1, 2, 3, 4, 5],[1,1,1,0,0])]) # 报错
arry=np.array([list([[ 1,2,3, 7, 11],[2,3,4,5,6]]),[1, 2, 3, 4, 5]]) # 报错

 创建常量值的(n*m)维数据
(1)创建以0为常量值:np.zeros((n*m),dytpe=float/int)
(2)创建以1为常量值:np.ones((n*m))
(3)创建一个空数组:np.empty((n*m))

 创建随机数字的数组

生成随机数种子:

(1)np.random.seed()
(2)np.random.RandomState()

生成随机数:

函数 取值 说明
1 np.random.rand(d0,d1,…,dn) [0,1) 根据给定维度生成数组,服从均匀分布
2 np.random.randint(low, high=None, size=None, dtype='l') [0,low)或者[low,high) 根据size生成离散均匀分布的整数值
3 np.random.randn(d0,d1,…,dn) 根据给定维度生成数组,服从标准正态分布
4 np.random.random_sample(size=None) [0,1) 根据给定维度生成随机浮点数
5 np.random.random(size=None) [0,1) 根据给定维度生成随机浮点数
6 np.random.ranf(size=None) [0,1) 根据给定维度生成随机浮点数
7 np.random.sample(size=None) [0,1) 根据给定维度生成随机浮点数

生成有分布规律的随机数组
(1)二项分布:np.random.binomial(n, p, size)
(2)正态分布:np.random.normal(loc, scale, size)

 将csv文件转化成数组或阵列

使用 np.genfromtxt( ‘csv文件名',delimiter = ‘文件中的分割符' )函数将文件转化成数组

csv_array = np.genfromtxt('sample.csv', delimiter=',')
 print(csv_array)

3. 数组的变形

生成数组/矩阵转置的函数,即行列数字交换,使用.T

a = np.array([[32, 15, 6, 9, 14], 
    [12, 10, 5, 23, 1],
    [2, 16, 13, 40, 37]])
print(a.T)

-------------------
# 结果如下
[[32 12 2]
 [15 10 16]
 [ 6 5 13]
 [ 9 23 40]
 [14 1 37]]

 改变数组的形状:

(1)arr.resize(n,m) :arr.resize(n,m)函数是原地修改数组,要求:元素的个数必须一致

a=np.arange(8)
a.resize(2,4)
print(a)

---------------------------
[[0 1 2 3]
 [4 5 6 7]]

(2)arr.reshape(n,m):如果某一个维度的参数为-1,则表示元素总个数会迁就另一个维度来计算

a=np.arange(8).reshape(-1,1)
print(a)

-----------------
[[0]
 [1]
 [2]
 [3]
 [4]
 [5]
 [6]
 [7]]

将一维升至二维:np.newaxis

np.newaxis实际上是直接增加维度的意思,我们一般不会给数组增加太多维度,这里以一维增加到二维为例:

(1)增加行维度:arr[np.newaxis, :]
(2)增加列维度:arr[: , np.newaxis]

a=np.arange(8)

a  # array([0, 1, 2, 3, 4, 5, 6, 7])
a.shape  # (8,)
a[np.newaxis, :] # array([[0, 1, 2, 3, 4, 5, 6, 7]])
a.shape  # (8,)
a[: , np.newaxis] # array([[0],[1],[2],[3],[4],[5],[6],[7]])
a.shape  # (8,)

降维:arr.ravel()

arr.ravel()函数在降维时:默认是行序优先生成新数组(就是一行行读);如果传入参数“F”则是列序降维生成新数组

a=np.array([[1,2],[3,4]])
a.ravel() 
a.ravel('F') 

----------------------------
# 结果 array([1, 2, 3, 4])
# 结果 array([1, 3, 2, 4])

4. 计算

对数组进行计算操作

(1)对元素进行加减计算

a=np.arange(8).reshape(2,4) # array([[0, 1, 2, 3], [4, 5, 6, 7]])
b=np.random.randint(8,size=(2,4)) # array([[1, 2, 5, 3], [4, 1, 0, 6]])
a+b
a-b

----------------------------
# a+b和a-b结果分别是:
array([[ 1, 3, 7, 6],
  [ 8, 6, 6, 13]])
array([[-1, -1, -3, 0],
  [ 0, 4, 6, 1]])

(2)乘法:平方/矩阵中元素相乘

a=np.arange(8).reshape(2,4) # array([[0, 1, 2, 3], [4, 5, 6, 7]])
b=np.random.randint(8,size=(2,4)) # array([[1, 2, 5, 3], [4, 1, 0, 6]])
a**2
a*b

-----------------------
# a矩阵平方/a*b矩阵中元素相乘结果分别:
array([[ 0, 1, 4, 9],
  [16, 25, 36, 49]])
array([[ 0, 2, 10, 9],
  [16, 5, 0, 42]])

(3)矩阵*矩阵:

# 要求a矩阵的行要等于b矩阵的列数;且a矩阵的列等于b矩阵的行数
a=np.arange(8).reshape(2,4) # array([[0, 1, 2, 3], [4, 5, 6, 7]])
b=np.random.randint(8,size=(4,2)) # array([[3, 0],[3, 3],[5, 6],[6, 7]])
c1 = np.dot(a,b)
c2 = a.dot(b)

----------------------
# ab矩阵相乘的结果:c1=c2 
array([[ 31, 36],
  [ 99, 100]])

(4)逻辑计算

【注】列表是无法作为一个整体对其中的各个元素进行逻辑判断的!

# 结果返回:一个数组,其中每个元素根据逻辑判断的布尔类型的结果
a > 3 
-----------------------------
# 结果如下:
array([[False, False, False, False],
  [ True, True, True, True]])

5. 取值

获取一维数组中的某个元素:操作和list列表的index一样

a = np.array([5, 2, 7, 0, 11])

a[0] # 结果为 5
a[:4] # 结果为 从头开始到索引为4结束
a[2:] # 结果为 从索引为2的开始到结尾
a[::2] # 结果为 从头开始到结尾,每2个取一个值

获取多维数组的某个元素,某行或列值

a = np.array([[32, 15, 6, 9, 14], 
    [12, 10, 5, 23, 1],
    [2, 16, 13, 40, 37]])

a[2,1]  # 结果是一个元素 16
a[2][1]  # 结果是一个元素 16
a[1]  # 第2行 array([12, 10, 5, 23, 1])
a[:,2]  # 取出全部行,第2列 [15,10,16]
a[1:3, :] # 取出[1,3)行,全部列
a[1,1:]  # array([10, 5, 23, 1])

 获取满足逻辑运算的

# 需要注意的是,我们数据进行逻辑计算操作得到的仍然是一个数组
# 如果我们想要的是一个过滤后的数组,就需要将"逻辑判断"传入数组中
a = np.array([[32, 15, 6, 9, 14], 
    [12, 10, 5, 23, 1],
    [2, 16, 13, 40, 37]])

a[a > 3]
a[(a > 3) | (a < 2)] 

------------------------------
# 结果分别是:
array([32, 15, 6, 9, 14, 12, 10, 5, 23, 16, 13, 40, 37])
array([32, 15, 6, 9, 14, 12, 10, 5, 23, 1, 16, 13, 40, 37])

遍历:结果是按行输出

a = np.array([[32, 15, 6, 9, 14], 
    [12, 10, 5, 23, 1],
    [2, 16, 13, 40, 37]])
for x in a:
 print(x)

--------------------
[32 15 6 9 14]
[12 10 5 23 1]
[ 2 16 13 40 37]

6. 复制/分割/合并

复制:arr.cope()

分割:

(1)等分:np.split(arr, n, axis=0/1)(即行数或列数可以整除n时才可以)
(2)不等分:np.array_split(arr, n) 默认按行分n份

a = np.array([[32, 15, 6, 9, 14, 21], 
    [12, 10, 5, 23, 1, 10],
    [2, 16, 13, 40, 37, 8]])
    
# 可以看到a矩阵是(3*6),所以使用np.split()只能尝试行分成3份;或者列分成2/3/6份 
np.split(a,3,axis=0) 
np.split(a,3,axis=1)

np.array_split(a,2)
np.array_split(a,4,axis=1)

-------------------------------------------
[array([[32, 15, 6, 9, 14, 21]]),
 array([[12, 10, 5, 23, 1, 10]]),
 array([[ 2, 16, 13, 40, 37, 8]])]
 
[array([[32, 15],
  [12, 10],
  [ 2, 16]]), array([[ 6, 9],
  [ 5, 23],
  [13, 40]]), array([[14, 21],
  [ 1, 10],
  [37, 8]])]
  
[array([[32, 15, 6, 9, 14, 21],
  [12, 10, 5, 23, 1, 10]]), array([[ 2, 16, 13, 40, 37, 8]])]
  
[array([[32, 15],
  [12, 10],
  [ 2, 16]]), array([[ 6, 9],
  [ 5, 23],
  [13, 40]]), array([[14],
  [ 1],
  [37]]), array([[21],
  [10],
  [ 8]])]

合并:np.concatenate((arr1,arr2,arr3), axis=0/1) 默认接在数据下面

a=np.random.rand(2,3)
b=np.random.randint(1,size=(2,3))

np.concatenate((a,b,a))  # 接在下面
np.concatenate((a,b,a),axis=1) # 接在后面

------------------------
array([[0.95912866, 0.81396527, 0.809493 ],
  [0.4539276 , 0.24173315, 0.63931439],
  [0.  , 0.  , 0.  ],
  [0.  , 0.  , 0.  ],
  [0.95912866, 0.81396527, 0.809493 ],
  [0.4539276 , 0.24173315, 0.63931439]])

​array([[0.95912866, 0.81396527, 0.809493 , 0.  , 0.  ,
  0.  , 0.95912866, 0.81396527, 0.809493 ],
  [0.4539276 , 0.24173315, 0.63931439, 0.  , 0.  ,
  0.  , 0.4539276 , 0.24173315, 0.63931439]])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
详解python 注释、变量、类型
Aug 10 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
python使用MQTT给硬件传输图片的实现方法
May 05 Python
Python简易版停车管理系统
Aug 12 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
Pytorch 之修改Tensor部分值方式
Dec 27 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
Mar 27 Python
python中封包建立过程实例
Feb 18 Python
Pygame Rect区域位置的使用(图文)
Nov 17 Python
Python logging设置和logger解析
Aug 28 #Python
Python shelve模块实现解析
Aug 28 #Python
解决python明明pip安装成功却找不到包的问题
Aug 28 #Python
Python 函数list&amp;read&amp;seek详解
Aug 28 #Python
Python collections模块使用方法详解
Aug 28 #Python
对python中的*args与**kwgs的含义与作用详解
Aug 28 #Python
关于python导入模块import与常见的模块详解
Aug 28 #Python
You might like
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
php 短链接算法收集与分析
2011/12/30 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
JS设计模式之惰性模式(二)
2017/09/29 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
vue中使用input[type=&quot;file&quot;]实现文件上传功能
2018/09/10 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
python将图片文件转换成base64编码的方法
2015/03/14 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
css3 按钮样式简单可扩展创建
2013/03/18 HTML / CSS
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
研究生毕业鉴定
2014/01/29 职场文书
毕业生就业意向书
2014/04/01 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
2015年导购员工作总结
2015/04/25 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书