Numpy中stack(),hstack(),vstack()函数用法介绍及实例

1.stack()函数

函数原型为:stack(arrays,axis=0),arrays可以传数组和列表。axis的含义我下面会讲解,我们先来看个例子,然后我会分析输出结果。

import numpy as np
a=[[1,2,3],
 [4,5,6]]
print("列表a如下:")
print(a)

print("增加一维,新维度的下标为0")
c=np.stack(a,axis=0)
print(c)

print("增加一维,新维度的下标为1")
c=np.stack(a,axis=1)
print(c)

输出:
列表a如下:
[[1, 2, 3], [4, 5, 6]]
增加一维,新维度下标为0
[[1 2 3]
 [4 5 6]]
增加一维,新维度下标为1
[[1 4]
 [2 5]
 [3 6]]

首先这里arrays我传的是一个列表,现在我开始讲解这个stack()函数的意思,它就是对arrays里面的每个元素(可能是个列表,元组,或者是个numpy的数组)变成numpy的数组后,再对每个元素增加一维(至于维度加在哪里,是靠axis控制的),然后再把这些元素串起来(至于怎么串,我下面会说)。

arrays里面的每个元素必须形状是一样的,例如本例中列表a中的两个元素[1,2,3]和[4,5,6]的形状是一样的,如果把[4,5,6]换成[4,5] ,那么程序会报错!而axis代表的是在哪个维度上加一维,例如axis=0(它是默认的)代表的就是增加的这一维的下标为0,axis等于多少不是随便乱写的,如果参数arrays里面的每个元素是个1维的,那么调用stack()函数增加一维后会变成2维的,所以axis只能等于0和1(维度的下标是从0开始的),而参数axis=0和axis=1得到的结果是不一样的。

例如上面的代码中a列表中的第一个元素为[1,2,3],那么当axis=0的时候,就是在它的中括号外面再加一个中括号,变成[ [1,2,3] ](其实1,2,3之间是没有逗号的,因为stack()函数会先把参数arrays中的每个元素变成numpy的数组,数组之间是没有逗号的,看看上面的代码输出就知道了,这里大家明白就行,我为了方便讲解,下面还会加上逗号),这样最外面那层中括号才代表维度下标为0的那维;当axis=1的时候,就是在里面加个中括号,变成了[ [1],[2],[3] ],这样里面加的那层中括号才代表维度下标为1的那维。同理当axis=0的时候[4,5,6]变成[ [ 4,5,6] ],当axis=1的时候,变成[ [4],[5],[6] ]。下面我们讲如何把增加一维度后的每个元素串起来。

怎么把上面那两个元素增加维度后的结果串起来呢,其实很简单。现在我们已经知道了增加维度无非是增加中括号的意思,至于在哪里加中括号,取决于axis等于几。我们把增加的中括号想像成一个个的箱子。还拿上面的代码来说,当axis=0的时候,我们把套在[1,2,3]外面的中括号(就是[ [1,2,3] ]最外层的那个中括号)看做是箱子A,这个箱子A也会套在[4,5,6]的外面,所以我们就先把[1,2,3]和[4,5,6]放在一起,变成[1,2,3],[4,5,6],然后再一起套上箱子A,变成[ [1,2,3],[4,5,6] ]这就是当axis=0的时候程序的输出结果。

现在再来看当axis=1的时候,对于[1,2,3],我们把套在1外面的箱子(就是上面讲的[ [1],[2],[3] ]中1外面的那层中括号)看做A,套在2外面的看做B,套在3外面的看做C,同理,箱子A也会套在4的外面,箱子B也会套在5的外面,箱子C也会套在6的外面。那么我们就把1和4放一起,2和5放一起,3和6放一起,变成[ 1,4 ,2,5 ,3,6 ]然后把箱子A,B,C分别套在1,4 , 2,5 , 3,6的外面,变成[ [1,4] , [2,5] , [3,6] ]这就是程序中axis=1的时候程序的输出结果。

大家发现了没有,串起来的时候其实就是把arrays中每个元素在相同的位置套箱子的一些小块(这里叫小块这个名词可能不洽当,但是大家明白就行)放在一起后,再套箱子,就是外面套个中括号,这就是堆叠。

再看下面的代码的输出,测试下你理解的没有。

import numpy as np
a=[[1,2,3,4],
 [5,6,7,8],
 [9,10,11,12]]
print("列表a如下:")
print(a)

print("增加一维,新维度的下标为0")
c=np.stack(a,axis=0)
print(c)

print("增加一维,新维度的下标为1")
c=np.stack(a,axis=1)
print(c)

输出:
列表a如下:
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
增加一维,新维度的下标为0
[[ 1 2 3 4]
 [ 5 6 7 8]
 [ 9 10 11 12]]
增加一维,新维度的下标为1
[[ 1 5 9]
 [ 2 6 10]
 [ 3 7 11]
 [ 4 8 12]]

不知道和你想象的输出一样不一样,还有另一种情况,先看下面的代码。

import numpy as np
a=[1,2,3,4]
b=[5,6,7,8]
c=[9,10,11,12]
print("a=",a)
print("b=",b)
print("c=",c)

print("增加一维,新维度的下标为0")
d=np.stack((a,b,c),axis=0)
print(d)

print("增加一维,新维度的下标为1")
d=np.stack((a,b,c),axis=1)
print(d)

输出:
('a=', [1, 2, 3, 4])
('b=', [5, 6, 7, 8])
('c=', [9, 10, 11, 12])
增加一维,新维度的下标为0
[[ 1 2 3 4]
 [ 5 6 7 8]
 [ 9 10 11 12]]
增加一维,新维度的下标为1
[[ 1 5 9]
 [ 2 6 10]
 [ 3 7 11]
 [ 4 8 12]]

你会发现输出结果和上面的代码一样,其实它俩就是一样的。只不过当你对arrays传参的时候,如果你传的参数是类似于(a,b,c)这种,它会把(a,b,c)当做一个元组来看,a,b,c都是元组的每个元素。然后分别对每个元素处理,上面我已经说了,arrays传的参数可以是列表,元组,或者numpy数组。所以传(a,b,c)和传[a,b,c]或者当x=[a,b,c]的时候传x,效果都是一样的。

上面的代码处理的arrays元素都是一维变二维的情况,下面我们看看二维变三维是什么样的。

import numpy as np
a=[[1,2,3],
 [4,5,6]]
b=[[1,2,3],
 [4,5,6]]
c=[[1,2,3],
 [4,5,6]]
print("a=",a)
print("b=",b)
print("c=",c)

print("增加一维,新维度的下标为0")
d=np.stack((a,b,c),axis=0)
print(d)

print("增加一维,新维度的下标为1")
d=np.stack((a,b,c),axis=1)
print(d)
print("增加一维,新维度的下标为2")
d=np.stack((a,b,c),axis=2)
print(d)

输出:
('a=', [[1, 2, 3], [4, 5, 6]])
('b=', [[1, 2, 3], [4, 5, 6]])
('c=', [[1, 2, 3], [4, 5, 6]])
增加一维,新维度的下标为0
[[[1 2 3]
 [4 5 6]]

 [[1 2 3]
 [4 5 6]]

 [[1 2 3]
 [4 5 6]]]
增加一维,新维度的下标为1
[[[1 2 3]
 [1 2 3]
 [1 2 3]]

 [[4 5 6]
 [4 5 6]
 [4 5 6]]]
增加一维,新维度的下标为2
[[[1 1 1]
 [2 2 2]
 [3 3 3]]

 [[4 4 4]
 [5 5 5]
 [6 6 6]]]

当axis=0的时候,列表a,b,c最外面都需要套箱子(就是加中括号),那么我把你们先放一起,变成下面这样

[[1,2,3],[4,5,6]],
[[1,2,3],[4,5,6]],
[[1,2,3],[4,5,6]]

然后在最外面套箱子,变成

[
[[1,2,3],[4,5,6]],
[[1,2,3],[4,5,6]],
[[1,2,3],[4,5,6]]
]

当axis=1的时候,列表a,b,c中的[1,2,3]需要套同样的箱子,列表a,b,c中的[4,5,6]需要套同样的箱子,好,我先把你们放一块变成下面这样

[
 [1,2,3],[1,2,3],[1,2,3]
 ,
 [4,5,6],[4,5,6],[4,5,6]

]

然后开始分别在 [1,2,3],[1,2,3],[1,2,3]的外面和[4,5,6],[4,5,6],[4,5,6]的外面套箱子,变成下面这样

[
 [[1,2,3],[1,2,3],[1,2,3]]
 ,
 [[4,5,6],[4,5,6],[4,5,6]]

]

当axis=2的时候,列表a,b,c中的1,2,3,4,5,6都需要套箱子,我把你们先放一起变成:

[
 [1,1,1 , 2,2,2 , 3,3,3],
 [4,4,4 , 5,5,5 , 6,6,6]
]

然后在1,1,1 ………6,6,6的外面分别套箱子变成:

[
 [[1,1,1] , [2,2,2] , [3,3,3]],
 [[4,4,4] , [5,5,5] , [6,6,6]]
]

关于stack()函数就讲这么多,这也是我全部理解的部分。

2. hstack()函数

函数原型:hstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。看下面的代码体会它的含义

import numpy as np
a=[1,2,3]
b=[4,5,6]
print(np.hstack((a,b)))

输出:[1 2 3 4 5 6 ]
import numpy as np
a=[[1],[2],[3]]
b=[[1],[2],[3]]
c=[[1],[2],[3]]
d=[[1],[2],[3]]
print(np.hstack((a,b,c,d)))

输出:
[[1 1 1 1]
 [2 2 2 2]
 [3 3 3 3]]

它其实就是水平(按列顺序)把数组给堆叠起来,vstack()函数正好和它相反。

3. vstack()函数

函数原型:vstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。看下面的代码体会它的含义

import numpy as np
a=[1,2,3]
b=[4,5,6]
print(np.vstack((a,b)))

输出:
[[1 2 3]
 [4 5 6]]
import numpy as np
a=[[1],[2],[3]]
b=[[1],[2],[3]]
c=[[1],[2],[3]]
d=[[1],[2],[3]]
print(np.vstack((a,b,c,d)))

输出:
[[1]
 [2]
 [3]
 [1]
 [2]
 [3]
 [1]
 [2]
 [3]
 [1]
 [2]
 [3]]

它是垂直(按照行顺序)的把数组给堆叠起来。

总结

以上就是本文关于Numpy中stack(),hstack(),vstack()函数用法介绍及实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • Python+matplotlib+numpy实现在不同平面的二维条形图
  • Python+matplotlib+numpy绘制精美的条形统计图
  • python的numpy模块安装不成功简单解决方法总结
  • windows 下python+numpy安装实用教程
  • numpy中索引和切片详解
  • 利用numpy实现一、二维数组的拼接简单代码示例
  • numpy自动生成数组详解
  • numpy排序与集合运算用法示例
  • 浅谈numpy数组的几种排序方式
(0)

相关推荐

  • Python+matplotlib+numpy实现在不同平面的二维条形图

    在不同平面上绘制二维条形图. 本实例制作了一个3d图,其中有二维条形图投射到平面y=0,y=1,等. 演示结果: 完整代码: from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np # Fixing random state for reproducibility np.random.seed(19680801) fig = plt.figure() ax = fig.a

  • Python+matplotlib+numpy绘制精美的条形统计图

    本文实例主要向大家分享了一个Python+matplotlib+numpy绘制精美的条形统计图的代码,效果展示如下: 完整代码如下: import matplotlib.pyplot as plt from numpy import arange from numpy.random import rand def gbar(ax, x, y, width=0.5, bottom=0): X = [[.6, .6], [.7, .7]] for left, top in zip(x, y): ri

  • windows 下python+numpy安装实用教程

    如题,今天兜兜转转找了很多网站帖子,一个个环节击破,最后装好费了不少时间. 希望这个帖子能帮助有需要的人,教你一篇帖子搞定python+numpy,节约科研时间. 水平有限,难免存在不足,敬请指正. *******************python安装**************************************************** step1:官网下载安装包: https://www.python.org/ 我下载的是python-3.4.4.msi step2:pyt

  • numpy排序与集合运算用法示例

    这里有numpy数组的相关介绍http://www.jb51.net/article/130657.htm 排序 numpy与python列表内置的方法类似,也可通过sort方法进行排序. 用法如下: In [1]: import numpy as np In [2]: x = np.random.randn(9) In [3]: x Out[3]: array([-0.4041504 , -0.42198556, 0.92807217, -2.66609196, 1.50915897, 0.3

  • numpy自动生成数组详解

    1 np.arange(),类似于range,通过指定开始值,终值和步长来创建表示等差数列的一维数组,注意该函数和range一样结果不包含终值. >>> np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.arange(0,1,0.1) array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]) >>> 2 np.linspace

  • python的numpy模块安装不成功简单解决方法总结

    为了画个图,被numpy这个模块的安装真的折腾疯了!!!一直装不上,花了几个小时,看了网上的很多教程.方法发现总结得不是很全,这里总结一下,防止大家再出现这个问题没有解决方法. Python的魅力之一,就是拥有众多功能强大的插件,但是这些插件的寻找.安装.升级在windows系统上却非常之麻烦.首先安装完Python后需要在系统配置环境变量,接下来又要安装Setuptools,而且安装过程中还会报编码错误,对于需要拷贝源码安装的还需要去CMD里打命令,还得小心翼翼避免打错参数,如果没有一位有经验

  • numpy中索引和切片详解

    索引和切片 一维数组 一维数组很简单,基本和列表一致. 它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改). 这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本(.copy()). import numpy as np #导入numpy arr = np.arange(10) #类似于list的range() arr Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) arr[4] #索引(注意是从

  • 利用numpy实现一、二维数组的拼接简单代码示例

    一维数组 1.numpy初始化一维数组 a = np.array([1,2,3]); print a.shape 输出的值应该为(3,) 二维数组 2.numpy初始化二维数组 a = np.array([[1,2,3]]); b = np.array([[1],[2],[3]]); print a.shape//(1,3) print b.shape//(3,1) 注意(3,)和(3,1)的数组是不一样的,前者是一维数组,后者是二维数组. 拼接 3.numpy有很多的拼接函数.比如hstack

  • 浅谈numpy数组的几种排序方式

    简单介绍 NumPy系统是Python的一种开源的数组计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)). 创建数组 创建1维数组: data = np.array([1,3,4,8]) 查看数组维度 data.shape 查看数组类型 data.dtype 通过索引获取或修改数组元素 data[1] 获取元素 data[1] = 'a' 修改元素 创建二维数组 data

  • Numpy中stack(),hstack(),vstack()函数用法介绍及实例

    1.stack()函数 函数原型为:stack(arrays,axis=0),arrays可以传数组和列表.axis的含义我下面会讲解,我们先来看个例子,然后我会分析输出结果. import numpy as np a=[[1,2,3], [4,5,6]] print("列表a如下:") print(a) print("增加一维,新维度的下标为0") c=np.stack(a,axis=0) print(c) print("增加一维,新维度的下标为1&qu

  • python 的numpy库中的mean()函数用法介绍

    1. mean() 函数定义: numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globals._NoValue at 0x40b6a26c>)[source] Compute the arithmetic mean along the specified axis. Returns the average of the array elements. The average is taken over

  • oracle中length、lengthb、substr、substrb函数用法介绍

    我记得我曾经在开发form的时候犯过这样一个错误,对于form中的某个字段,对应于数据库中某张表的字段,假设在数据库中这个字段一般也就用到20个汉字的长度,后来我在开发form的时候,设置item类型长度的时候,我惯性的设置成了50byte,想着就算是20个汉字,最多也就占40个byte长度嘛.可是,就因为这一个想当然,结果出现错误了,后来发现数据库字符集编码是utf8,那么应该设置为60.从那以后,每次涉及到给字段设置长度的时候,我都会特别注意下,到底是啥编码. 在oracle中,比较常见的可

  • PHP中addcslashes与stripcslashes函数用法分析

    本文实例分析了PHP中addcslashes与stripcslashes函数用法.分享给大家供大家参考,具体如下: 在写一个网站的英文版时,写完后填加英文资料,我随便填写时一点问题没有,但每当填加指定的内容时却填加不上,也不报错,我查看了数据库,发现这个字段用的是"TEXT"数据数型,我以为是内容过长的原因,于是我把数据类型改成了"longtext",但提交时发现还是出现同样的问题.下面我们给大家介绍一下addcslashes函数吧! 后来请教同事,同事发现在是英文

  • 对python中array.sum(axis=?)的用法介绍

    根据代码中运行的结果来看,主要由以下几种: 1. sum():将array中每个元素相加的结果 2. axis对应的是维度的相加. 比如: 1.axis=0时,对饮搞得是第一个维度元素的相加, [[0,1,2,3],[4,5,6,7]]和[[1,2,3,4],[5,6,7,8]]对应元素相加[[0+4,1+2,2+3,3+4],[4+5,5+6,7+7,7+8]]=[[1,3,5,7],[9,11,14,16]] 2.axis=1时, 对应的是第二个维度元素相加,这时候保留第一个维度的结构(第一

  • JavaScript中常见内置函数用法示例

    本文实例讲述了JavaScript中常见内置函数用法.分享给大家供大家参考,具体如下: 一.介绍 在使用JavaScript语言时,除了可以自定义函数之外,还可以使用JavaScript的内置函数,这些内置函数是由JavaScript语言自身提供的函数. 二.一些常用的内置函数做详细介绍 1.parseInt()函数 该函数主要将首位为数字的字符串转化成数字,如果字符串不是以数字开头,那么将返回NaN. 语法: parseInt(StringNum,[n]) StringNum:需要转换为整型的

  • python中str内置函数用法总结

    大家在使用python的过程中,应该在敲代码的时候经常遇到str内置函数,为了防止大家搞混,本文整理归纳了str内置函数.1字符串查找类:find.index:2.字符串判断类:islower.isalpha:3.内容判断类:tartswith.endswith:4.操作类函数:format.strip.join. 1.字符串查找类:find.index find和index均是查找字符串中是否包含一个子串: 二者的区别是index找不到字符串会报错,而find会返回-1: rfind.lfin

  • numpy中的converters和usecols用法详解

    目录 方法一:使用usecols 方法二:使用numpy 方法三:使用切片区间 总结: 用Python打开Excel数据,读取时需要将”学号“和“ID"转换成字符,以便后续操作 df = pd.read_excel(path, converters={'学号': str, 'ID': str}) 以下是我的经历来体会: 我在从Excel读入python的数据时,发现读出的是空值: import pandas as pd df=pd.read_excel("D:/Python/05Dat

  • php中ftp_chdir与ftp_cdup函数用法

    本文实例讲述了php中ftp_chdir与ftp_cdup函数用法.分享给大家供大家参考.具体用法如下: ftp_chdir()函数 若成功,则返回 true,否则返回 false,如果切换目录失败,php还会发出一条警告. 语法:ftp_chdir(ftp_connection,directory) 参数 描述 ftp_connection 必需,规定要使用的 ftp 连接,ftp 连接的标识符. directory 必需,规定要切换到的目录. 复制代码 代码如下: //设置基础连接 $con

  • php中getservbyport与getservbyname函数用法实例

    本文实例讲述了php中getservbyport与getservbyname函数用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: string getservbyport ( int $port , string $protocol )   */ $services=array('80','21','22','23','25','143');      //定义数组 foreach($services as $service)         //循环读取内容 {   $protoc

随机推荐