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 相关文章推荐
python使用pil生成图片验证码的方法
May 08 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
python之从文件读取数据到list的实例讲解
Apr 19 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
Python爬虫headers处理及网络超时问题解决方案
Jun 19 Python
python3 循环读取excel文件并写入json操作
Jul 14 Python
Python collections模块的使用方法
Oct 09 Python
对Pytorch 中的contiguous理解说明
Mar 03 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中去掉字符串首尾空格的方法
2012/05/19 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
php给数组赋值的实例方法
2019/09/26 PHP
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
js下拉菜单语言选项简单实现
2013/09/23 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
分享6个隐藏的python功能
2017/12/07 Python
mac系统安装Python3初体验
2018/01/02 Python
python实现Floyd算法
2018/01/03 Python
python实现决策树分类(2)
2018/08/30 Python
Django模型验证器介绍与源码分析
2020/09/08 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
用css3写出气球样式的示例代码
2017/09/11 HTML / CSS
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
大学毕业生通用自我评价
2014/01/05 职场文书
企业安全生产标语
2014/06/06 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
PHP策略模式写法
2021/04/01 PHP