python ndarray合并_Python干货-Numpy的ndarray的合并与分割_weixin_39679718的博客-程序员宅基地

技术标签: python ndarray合并  

# 导入numpy

import numpy as np

ndarray的合并

定义要使用的数据源

a = np.array([1, 1, 1])

b = np.array([2, 2, 2])

print('a', a)

print('b', b)

a [1 1 1]

b [2 2 2]

numpy.vstack()函数

语法:vstack(tup),参数是一个元组,它可将元组中指定的数组进行合并

# 将a与b合并

c = np.vstack((a, b))

print('合并结果:\n', c)

print('c的形状:\n', c.shape)

合并结果:

[[1 1 1]

[2 2 2]]

c的形状:

(2, 3)

从结果来看,两上一维数组合并后的结果是一个地维数组

numpy.hstack()函数

语法:hstack(tup),参数是一个元组

与 vstack不同的是,vstack将数组进行纵向合并,而hstack将数组进行横向合并

vstack 是 vertical stack 的缩写

hstack 是 horizontal stack 的缩写

# 将a与b合并

c = np.hstack((a, b))

print('合并结果:\n', c)

print('c的形状:\n', c.shape)

合并结果:

[1 1 1 2 2 2]

c的形状:

(6,)

可以看出,两个一维数组对象横向合并后,还是一个一维的序列,不过,元素的个数是被合并数组元素个数之和

将a或b行转成列

a = a.T

print(a)

[1 1 1]

上面的方式是无法将a进行行转列的,原因是a是个一维数组,它根本就没有列,正确的方式是:

c = a.reshape((3, 1))

print(c)

[[1]

[1]

[1]]

重新定义形状后,现在a是一个3行1列的矩阵,即一个二维数据

思考:a.reshape()是将a所指向的数组的形状改变了吗?再来查看a

print(a)

[1 1 1]

实际上,a.reshape()只是创建了一个a的副本,然后将该副本的内存地址赋给了变量c,而a变量所指向的数组还是原来的对象

newaxis属性

还有另外一组方式可以改变a的形状,也是返回一个不置可否;axis表示“轴”的意思

# 在行上增加一个维度(增加一个轴)

c = a[np.newaxis, :]

print(c)

print(c.shape)

print('-'*15)

# 在列上增加一个维度

c = a[:, np.newaxis]

print(c)

print(c.shape)

[[1 1 1]]

(1, 3)

---------------

[[1]

[1]

[1]]

(3, 1)

可以看出,返回的新对象的维度都已经发生了变化,在列方向上增加维度以后,将原先的一维数组变成了纵向的二维数组

_a = a[:, np.newaxis]

_b = b[:, np.newaxis]

c = np.hstack((_a, _b))

print(c)

[[1 2]

[1 2]

[1 2]]

也可以将同一个对象进行合并

print(np.hstack((_a, _a, _b, _b)))

[[1 1 2 2]

[1 1 2 2]

[1 1 2 2]]

concatenate()也可以将数组进行合并,通过axis可以指定合并的方向

# 横向合并

c = np.concatenate((_a, _a, _b, _b), axis=1)

# 纵向合并

d = np.concatenate((_a,_b), axis=0)

print(c)

print('-'*10)

print(d)

[[1 1 2 2]

[1 1 2 2]

[1 1 2 2]]

----------

[[1]

[1]

[1]

[2]

[2]

[2]]

ndarray的分割

定义操作的数据源

# 定义操作的数据源

a = np.arange(12).reshape((3,4))

print(a)

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

按列分割

print(a)

print('-'*15)

print(np.split(a, 2, axis=1))

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

---------------

[array([[0, 1],

[4, 5],

[8, 9]]), array([[ 2, 3],

[ 6, 7],

[10, 11]])]

split第一个参数指要被分割的数组对象,第二个参数指将该对象分成几份,第三个参数指是从横向分割还是纵向分割,这里按列将其分成了两部分,类似于一个西瓜从上切下,切成了左右两半!按列分割,指定参数axis=1

按行分割

print(a)

print('-'*15)

print(np.split(a, 3, axis=0))

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

---------------

[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]

split第一个参数指要被分割的数组对象,第二个参数指将该对象分成几份,第三个参数指是从横向分割还是纵向分割,这里按行将其分成了三部分,类似于一个西瓜肚子上横切两刀,切成了上中下三部分!按行分割,指定参数axis=0

如果要将三行的数据分成2份,是分报错的,如下

print(np.split(a, 2, axis=0))

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

~\Anaconda3\envs\tensorflow\lib\site-packages\numpy\lib\shape_base.py in split(ary, indices_or_sections, axis)

534 try:

--> 535 len(indices_or_sections)

536 except TypeError:

TypeError: object of type 'int' has no len()

During handling of the above exception, another exception occurred:

ValueError Traceback (most recent call last)

in ()

----> 1 print(np.split(a, 2, axis=0))

~\Anaconda3\envs\tensorflow\lib\site-packages\numpy\lib\shape_base.py in split(ary, indices_or_sections, axis)

539 if N % sections:

540 raise ValueError(

--> 541 'array split does not result in an equal division')

542 res = array_split(ary, indices_or_sections, axis)

543 return res

ValueError: array split does not result in an equal division

如果要对数组进行不对等分割,类似于3行分成2份,则需要用到np.array_split()

print(a)

print('-'*15)

print(np.array_split(a, 2, axis=0))

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

---------------

[array([[0, 1, 2, 3],

[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]

在不对等的分割中,并不会出现1.5行这样的情况,所以会分成2行和1行

vsplit()和hsplit()

# 纵向分割

print(np.vsplit(a, 3))

[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]

vsplit()中的v是指Vertical的意思,指纵向的,垂直的;按行分割就是纵向分割,因为数据被分成了上下部分,类似于西瓜横切

# 横向分割

print(np.hsplit(a, 2))

[array([[0, 1],

[4, 5],

[8, 9]]), array([[ 2, 3],

[ 6, 7],

[10, 11]])]

hsplit()中的h是Horizontal的意思,指横向;按列分割就是横向的意思,因为将数据分成了左右两半,就像西瓜纵切

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39679718/article/details/110681952

智能推荐

java调用sap系统wsdl_Java调用Axis2用SAP WSDL生成的Stub文件_苏友学的博客-程序员宅基地

3、Java调用Axis2用SAP WSDL生成的Stub文件①建立JavaWeb工程,将axis的相关jar导入至lib文件②将第2步生成的Stub类文件放入项目包里,再新建1个TEST测试类③TEST测试类代码:packagecom;importorg.apache.axis2.client.Options;importorg.apache.axis2.transport.http.HTTPC...

个人心得——hanoi问题 汉诺塔问题详细分析_昨日余光的博客-程序员宅基地_hanoi塔

简单地介绍题目点进来的各位其实也应该不陌生了,三根柱子,N个圆盘,要求把所有的圆盘从第一根柱子放到第三根上,并且编号下面的圆盘不能放在编号上的圆盘上。这个问题其实知乎上有很多答主都答得不错,这里我想分析一下自己的一些收获。如何理解hanoi的逻辑我们都知道,hanoi塔在计算机语言中是一种递归的逻辑。很多人在关注这种递归的时候往往喜欢一步一步的追踪,以此来弄明白它的内层逻辑,简单地说,就是顺藤摸瓜,一步步推。但是要想简单快速的理解递归,这种方式是不提倡的。比如这题,O(2*n)的复杂度,4个盘子就

看漫画学强化学习_R3eE9y2OeFcU40的博客-程序员宅基地

作者:石塔西  爱好机器学习算法,以及军事和历史知乎ID:https://www.zhihu.com/people/si-ta-xi前言之前通过线上课程学习David Silver的《强化学习》,留下深刻印象的是其中一堆堆的公式。公式虽然严谨,但是对于我来...

Android中pendingIntent_Sparkling***的博客-程序员宅基地

pendingIntent字面意义:等待的,未决定的Intent。  pendingIntent对象,使用方法类的静态方法 :getActivity(Context, int, Intent, int)------->跳转到一个activity组件、getBroadcast(Context, int, Intent, int)------>打开一个广播组件getService(...

我最喜欢mondrain_weixin_30879169的博客-程序员宅基地

Mondrian是一个ROLAP的开源实现,大型项目一般会使用MOLAP,对Mondrian这类东西来说,一般用在中小型项目中比较合适,并且,如果要在项目中真正地使用起来,还需要了解它的源代码,毕竟它还不算一个很完善的产品,还有一些 bug,另外它的实现极其耗内存,cube存放于内存中,大量的对象也放在session中,所以我个人认为它还有许多的地方需要改进,好,废话少说,还是说说如何使用这个东西...

load average信息详解_aliaichidantong的博客-程序员宅基地_loadaverage详解

一、什么是load average?linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount of work that a computer system is doing)。也有简单的说是进程队列的长度。Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 L

随便推点

ngRx 官方示例分析 - 4.pages_weixin_34239592的博客-程序员宅基地

 Page 中通过构造函数注入 Store,基于 Store 进行数据操作。注意 Component 使用了 changeDetection: ChangeDetectionStrategy.OnPush.OnPush means that the change detector's mode will be set to CheckOnce during hydration. /...

js 原生手写AJAX_普通网友的博客-程序员宅基地_js原生请求

前言:最近在学习react,在练习中模拟一个button通过AJAX向后台发送POST请求,懒得引入AXIOS,就顺便练习了js原生ajax。 正文: 注:我忽略了IE6及以下版本 submit(){...

my97日期范围限制_乔哥的博客-程序员宅基地

My97date之功能及示例:日期范围限制1.静态限制    注意:日期格式必须与 realDateFmt 和 realTimeFmt 一致而不是与 dateFmt 一致    你可以给通过配置minDate(最小日期),maxDate(最大日期)为静态日期值,来限定日期的范围示例4-1-1 限制日期的范围是 2006-09-10到2008-12-20

www.yaxjf.com+m.php,在js中如何实现登录需要滑动验证_weixin_39623671的博客-程序员宅基地

下面我就为大家分享一篇js登录滑动验证的实现(不滑动无法登陆),具有很好的参考价值,希望对大家有所帮助。js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断pageEncoding="utf-8"%>String basePath = request.getContextPath();%>登录rel="stylesheet">rel="stylesheet">r...

centos7 mysql5.7 rpm 安装包安装_jishuxiaobai123的博客-程序员宅基地

首先先卸载linux自带的数据库mariadb1.去官网下载5.7安装包2. 查看有无mysql安装依赖 3. yum localinstall mysql80-community-release-el7-1.noarch.rpm4.yum repolist enabled5. vi /etc/yum.repos.d/mysql-community.repo6.groupa...

Java性能优化系列之五--JavaIO_XifengHZ的博客-程序员宅基地_javaio优化

1、关于Java序列化与反序列化:(1)作用:1、实现对象状态的保存到本地,以便下一次启动虚拟机的时候直接读取保存的序列化字节生成对象,而不是初始化对象;2、实现对象的网络传输(RMI分布对象);3、实现对象的深拷贝。    一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。    二:java对象序列化不仅保

推荐文章

热门文章

相关标签