前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >NumPy快速入门--形状操作

NumPy快速入门--形状操作

作者头像
Michael阿明
发布2021-02-20 11:10:40
发布2021-02-20 11:10:40
48800
代码可运行
举报
运行总次数:0
代码可运行

1. 更改数组的形状

代码语言:javascript
代码运行次数:0
复制
>>> import numpy as np
>>> a = np.floor(10*np.random.random((3,4)))
>>> a
array([[2., 2., 5., 6.],
       [2., 7., 4., 2.],
       [9., 3., 5., 8.]])
>>> a.shape
(3, 4)

数组的形状可通过各种命令更改。请注意,以下三个命令都返回修改后新的数组,原始数组不变

代码语言:javascript
代码运行次数:0
复制
ravel()、reshape(m,n)、T
代码语言:javascript
代码运行次数:0
复制
>>> a.ravel()		# ravel拆开的意思,展平数组
array([2., 2., 5., 6., 2., 7., 4., 2., 9., 3., 5., 8.])
>>> a.reshape(6,2)		#返回新的修改行数列数后的数组
array([[2., 2.],
       [5., 6.],
       [2., 7.],
       [4., 2.],
       [9., 3.],
       [5., 8.]])
>>> a.T				#行列互换,转置
array([[2., 2., 9.],
       [2., 7., 3.],
       [5., 4., 5.],
       [6., 2., 8.]])
>>> a.T.shape
(4, 3)
>>> a.shape
(3, 4)

下面这段话不明白: 由ravel()产生的数组中元素的顺序通常是“C风格”,也就是说,最右边的索引“改变最快”,所以[0,0]之后的元素是[0,1] 。如果数组被重新塑造成其他形状,数组又被视为“C-style”。NumPy通常创建按此顺序存储的数组,因此ravel()通常不需要复制其参数,但如果数组是通过切片另一个数组或使用不寻常选项创建的,则可能需要复制它。函数ravel()和reshape()也可以通过使用可选参数来指示使用FORTRAN风格的数组,其中最左侧的索引更改速度最快。

  • reshape(m,n) 函数返回具有修改形状的参数,而 ndarray.resize((m,n)) 方法修改原始数组
代码语言:javascript
代码运行次数:0
复制
>>> a
array([[2., 2., 5., 6.],
       [2., 7., 4., 2.],
       [9., 3., 5., 8.]])

>>> a.resize((2,6))
>>> a
array([[2., 2., 5., 6., 2., 7.],
       [4., 2., 9., 3., 5., 8.]])
  • 如果在reshape(m,n)操作中将维度指定为-1,则会自动计算该维度
代码语言:javascript
代码运行次数:0
复制
>>> a.reshape(3,-1)		#不想算的维度设置成-1,偷懒
array([[2., 2., 5., 6.],
       [2., 7., 4., 2.],
       [9., 3., 5., 8.]])
>>> a.reshape(-1,3)
array([[2., 2., 5.],
       [6., 2., 7.],
       [4., 2., 9.],
       [3., 5., 8.]])

2. 将不同数组堆叠在一起

  • 几个数组可以沿不同的轴堆叠在一起
代码语言:javascript
代码运行次数:0
复制
>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[5., 7.],
       [6., 0.]])
       
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[1., 5.],
       [1., 5.]])
       
>>> np.vstack((a,b))	# v 垂向叠加
array([[5., 7.],
       [6., 0.],
       [1., 5.],
       [1., 5.]])
       
>>> np.hstack((b,a))		# h 水平叠加
array([[1., 5., 5., 7.],
       [1., 5., 6., 0.]])
  • 函数 column_stack 将1D数组作为叠加到2D数组中。它相当于仅用于二维数组的 hstack
代码语言:javascript
代码运行次数:0
复制
>>> from numpy import newaxis
>>> np.column_stack((a,b))
array([[5., 7., 1., 5.],
       [6., 0., 1., 5.]])
       
>>> a = np.array([4,2])
>>> b = np.array([3,9])

>>> np.column_stack((a,b))
array([[4, 3],		# a、b 作为 列 向量
       [2, 9]])

>>> np.hstack((a,b))
array([4, 2, 3, 9])

>>> a[:,newaxis]		# 加入新的轴
array([[4],
       [2]])

>>> np.column_stack((a[:,newaxis],b[:,newaxis]))
array([[4, 3],
       [2, 9]])
>>> np.hstack((a[:,newaxis],b[:,newaxis]))		#两者结果一样
array([[4, 3],
       [2, 9]])
  • 函数 row_stack 相当于 vstack。一般来说,对于具有两个以上维度的数组,hstack 沿第二轴堆叠,vstack 沿第一轴堆叠,concatenate 允许一个可选参数,给出串接应该发生的轴。

在复杂情况下,r_c_ 可用于通过沿一个轴叠加数字来创建数组。它们允许使用范围字面量(“:”)

代码语言:javascript
代码运行次数:0
复制
>>> np.r_[1:5,8,9]
array([1, 2, 3, 4, 8, 9])

>>> np.c_[1:3,[8,9],									    
			  [10,11]]
array([[ 1,  8, 10],
       [ 2,  9, 11]])

3. 将一个数组分成几个较小的数组

  • 使用 hsplit ,可沿水平轴拆分,通过指定要返回的均匀划分的数组数量,或指定要在其后进行划分的列
代码语言:javascript
代码运行次数:0
复制
>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[8., 9., 8., 8., 9., 9., 3., 6., 2., 3., 3., 1.],
       [2., 5., 8., 5., 9., 2., 1., 3., 6., 1., 6., 8.]])
>>> np.hsplit(a,3)		# 将 a 分成3份
[array([[8., 9., 8., 8.],
       [2., 5., 8., 5.]]), array([[9., 9., 3., 6.],
       [9., 2., 1., 3.]]), array([[2., 3., 3., 1.],
       [6., 1., 6., 8.]])]
>>> np.hsplit(a,(3,4))
[array([[8., 9., 8.],
       [2., 5., 8.]]), array([[8.],
       [5.]]), array([[9., 9., 3., 6., 2., 3., 3., 1.],
       [9., 2., 1., 3., 6., 1., 6., 8.]])]
>>> np.hsplit(a,(3,5))		# 把3,4列划出来
[array([[8., 9., 8.],
       [2., 5., 8.]]), array([[8., 9.],
       [5., 9.]]), array([[9., 3., 6., 2., 3., 3., 1.],
       [2., 1., 3., 6., 1., 6., 8.]])]
  • vsplit 沿纵轴分割,并且 array_split 允许指定沿哪个轴分割。
代码语言:javascript
代码运行次数:0
复制
>>> a
array([[8., 9., 8., 8., 9., 9.],
       [3., 6., 2., 3., 3., 1.],
       [2., 5., 8., 5., 9., 2.],
       [1., 3., 6., 1., 6., 8.]])
>>> np.vsplit(a,(2,4))		# 把2,3行划出来
[array([[8., 9., 8., 8., 9., 9.],
       [3., 6., 2., 3., 3., 1.]]), 
       array([[2., 5., 8., 5., 9., 2.],[1., 3., 6., 1., 6., 8.]]), 
       array([], shape=(0, 6), dtype=float64)]
>>> np.vsplit(a,(2,3))		# 把2行划出来
[array([[8., 9., 8., 8., 9., 9.],
       [3., 6., 2., 3., 3., 1.]]), 
       array([[2., 5., 8., 5., 9., 2.]]), 
       array([[1., 3., 6., 1., 6., 8.]])]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 更改数组的形状
  • 2. 将不同数组堆叠在一起
  • 3. 将一个数组分成几个较小的数组
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档