numpy的基本API(四)——拼接、拆分、添加、删除
numpy的基本拼接、拆分、添加、删除API
iwehdio的博客园:https://www.cnblogs.com/iwehdio/
1、np.concatenate((a, b), axis=0) np.concatenate方法沿现有的轴拼接一系列数组。输入数组(a、b、c)等要以元组形式输入,要求除了在所指定的拼接轴外形状一致。axis表示所指示的拼接轴,默认为0,为None时表示拼接前将所有输入数组展平。
>>> a = np.arange(8).reshape(4, 2)
>>> b = np.arange(12).reshape(4, 3)
>>> np.concatenate((a, b), axis=1)
array([[ 0, 1, 0, 1, 2],
[ 2, 3, 3, 4, 5],
[ 4, 5, 6, 7, 8],
[ 6, 7, 9, 10, 11]])
2、np.stack((a, b), axis=0) np.stack方法按新轴进行拼接数组。输入数组要求为元组形式,并且必须具有完全相同的形状。。axis指定的是生成的新轴在shape中的索引。
>>> a = np.arange(8,20).reshape(4, 3)
>>> b = np.arange(12).reshape(4, 3)
>>> c = np.stack((a, b), axis=1)
>>> c
(4, 2, 3)
>>> c
array([[[ 8, 9, 10],
[ 0, 1, 2]],
[[11, 12, 13],
[ 3, 4, 5]],
[[14, 15, 16],
[ 6, 7, 8]],
[[17, 18, 19],
[ 9, 10, 11]]])
3、np.column_stack((a, b)) np.column_stack方法将输入数组作为列堆叠成二维数组,输入为元组形式,不一定必须为一维数组,但是必须形状相同。
>>> a = np.arange(8,11)
>>> b = np.arange(3)
>>> np.column_stack((a, b))
array([[ 8, 0],
[ 9, 1],
[10, 2]]) >>> a = np.arange(8,12).reshape(2, 2)
>>> b = np.arange(4).reshape(2, 2)
>>> np.column_stack((a, b))
array([[ 8, 9, 0, 1],
[10, 11, 2, 3]]
4、np.dstack((a, b)) np.dstack方法沿深度方向(第三轴,索引为2)按顺序拼接数组。输入数组同样要求为元组形式,且形状只在第三轴上不同。如果输入为形状为(M,N)的二维数组则等效为(M,N,1),如果输入为形状为(N,)的一维数组,则等效为(1,N,1)。
>>> a = np.arange(3).reshape(3)
>>> b = np.arange(3,6).reshape(1,3)
>>> c = np.dstack((a, b))
>>> c
array([[[0, 3],
[1, 4],
[2, 5]]])
>>> c.shape
(1, 3, 2)
5、np.hstack((a, b)) np.hstack方法沿列方向(第二轴,索引为1)按顺序拼接数组。输入数组同样要求为元组形式,且形状只在第二轴上不同。但是如果输入为形状为(N,)的一维数组,则在第一轴(索引为0)上将数组展平后拼接,生成形状为(n*N,)的一维数组。可以用来拼接列。
>>> a = np.arange(3).reshape(3)
>>> b = np.arange(3,6).reshape(3)
>>> np.hstack((a, b)).shape
(6,) >>> a = np.arange(3).reshape(3,1)
>>> b = np.arange(3,6).reshape(3,1)
>>> np.hstack((a, b)).shape
(3, 2)
6、np.vstack((a ,b)) np.vstack方法沿列方向(第一轴,索引为0)按顺序拼接数组。输入数组同样要求为元组形式,且形状只在第一轴上不同。但是如果输入为形状为(N,)的一维数组,则在第一轴(索引为0)上拼接,生成形状为(n,N)的二维数组。可以用来拼接行。
>>> a = np.arange(3).reshape(3,1)
>>> b = np.arange(3,6).reshape(3,1)
>>> np.vstack((a, b)).shape
(6, 1) >>> a = np.arange(3).reshape(3)
>>> b = np.arange(3,6).reshape(3)
>>> np.vstack((a, b)).shape
(2, 3)
7、np.block([ a, b ]) np.block方法将数组作为块输入,从块的嵌套列表中拼接一个数组。从输入的块的最后一个维度向前拼接,直到到达最外边的列表。可以用来创建块矩阵,也可以实现vstack和hstack的功能。如输入为[ a, b ]时相当于hstack((a,b)),输入为[[a],[b]]时相当于vstack((a,b))。
>>> A = np.eye(2) * 2
>>> B = np.eye(3) * 3
>>> np.block([
[A, np.zeros((2, 3))],
[np.ones((3, 2)), B ]])
array([[2., 0., 0., 0., 0.],
[0., 2., 0., 0., 0.],
[1., 1., 3., 0., 0.],
[1., 1., 0., 3., 0.],
[1., 1., 0., 0., 3.]]) >>> a = np.array([1, 2, 3])
>>> b = np.array([2, 3, 4])
>>> np.block([a, b]) # hstack
array([ 1, 2, 3, 2, 3, 4]) >>> np.block([[a], [b]]) # vstack
array([[1, 2, 3],
[2, 3, 4]])
8、np.r_[ ] np.r_方法可以自定义的完成以上所有拼接功能,具体可见numpy的基本API(三)。
9、np.split(x, a, axis=0) np.split方法可以将输入数组x进行拆分。如果a是一个整数且可整除数组长度,则将x拆分为a个数组,如果a是列表,则按列表中索引的位置进行拆分,超出值返回空列表。axis表示所要拆分的轴,默认为0。返回值为列表形式。
>>> x = np.arange(15)
>>> np.split(x,3)
[array([0, 1, 2, 3, 4]), array([5, 6, 7, 8, 9]), array([10, 11, 12, 13, 14])] >>> np.split(x, [0, 2, 5, 8, 13, 16])
[array([], dtype=int32),
array([0, 1]),
array([2, 3, 4]),
array([5, 6, 7]),
array([ 8, 9, 10, 11, 12]),
array([13, 14]),
array([], dtype=int32)] >>> x = x.reshape(3,5)
>>> np.split(x,[0,1,2],axis=1)
[array([], shape=(3, 0), dtype=int32),
array([[ 0],
[ 5],
[10]]),
array([[ 1],
[ 6],
[11]]),
array([[ 2, 3, 4],
[ 7, 8, 9],
[12, 13, 14]])]
10、np.dsplit(x,a) np.dsplit方法相当于np.split方法中axis=2。
11、np.hsplit(x,a) np.hsplit方法相当于np.split方法中axis=1。
12、np.vsplit(x,a) np.vsplit方法相当于np.split方法中axis=0。
以上三个方法是和np.dstack、 np.hstack、 np.vstack相对应的。
13、np.repeat(x, a) np.repeat方法重复输入数组x,重复次数为a,a可以为形状与x对应的数组。
>>> np.repeat(3, 4)
array([3, 3, 3, 3])
>>> x = np.array([[1,2],[3,4]])
>>> np.repeat(x, 2)
array([1, 1, 2, 2, 3, 3, 4, 4])
>>> np.repeat(x, 3, axis=1)
array([[1, 1, 1, 2, 2, 2],
[3, 3, 3, 4, 4, 4]])
>>> np.repeat(x, [1, 2], axis=0)
array([[1, 2],
[3, 4],
[3, 4]])
14、np.delet(x, a, axis=None) np.delet方法对输入数组x进行删除操作,a为删除的数组的索引,可以为列表,axis表示索引的轴,默认为展平数组。
>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> arr
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
>>> np.delete(arr, [0,1], 0)
array([[ 9, 10, 11, 12]])
15、np.insert(a, index, value, axis=None) np.insert方法在数组的指定位置插入数据。a为输入的原数组,index为插入的索引,可以为元组、列表和slice()索引。value为所要插入的数据,形状应与指定的轴对应,为数字时代表全部填充这个数。axis为选定的轴,默认为展平数组。需要注意的是index为多个时,numpy会按索引值从大到小插入数据,而且每次插入的数组都是完成上一个数据插入后返回的新数组。
>>> a = np.array([[1, 1], [2, 2], [3, 3]])
>>> a
array([[1, 1],
[2, 2],
[3, 3]]
>>> np.insert(a, 1, 5, axis=1)
array([[1, 5, 1],
[2, 5, 2],
[3, 5, 3]]) >>> np.insert(a, [1], [[1],[2],[3]], axis=1)
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]]) >>> b = a.flatten()
>>> np.insert(b, [2, 1, 0], [5, 3, 4])
array([4, 1, 3, 1, 5, 2, 2, 3, 3])
16、np.append(a, b, axis=None) np.append方法将值b拼接到数组a的末端,axis表示拼接的轴,默认为展平。
>>> np.append([[1, 2, 3], [4, 5, 6]], [[7, 8, 9]], axis=0)
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
17、np.resize(a, shape) resize方法改变输入数组a的形状。与reshape不同的是,resize直接更改了输入a的shape,而reshape是将更改后的数组作为返回值,数组a的shape没有改变。
18、np.trim_zeros(a, trim=''fb) np.trim_zeros删除一维数组中头部或尾部的0。a为输入数组,trim为‘fb’表示删除头尾的0,为‘f'表示删除头部的0,为‘b'表示删除尾部的0。
>>> a = np.array((0, 0, 0, 1, 2, 3, 0, 2, 1, 0))
>>> np.trim_zeros(a)
array([1, 2, 3, 0, 2, 1])
19、np.unique(a, return_index=False, return_inverse=False, return_counts=False, axis=None) np.unique方法用于查找数组中的唯一元素,返回排序好的数组中的元素,可以理解为数组a转换为集合。a为输入数组,axis为查找的最小元组,默认为展平即数字元素,如取0则查找唯一列。return_index表示返回数组a的唯一值的索引,数组中有多个相同值则返回最小的索引;return_inverse表示按数组a中的顺序,返回数组a中唯一值的索引,可以用于数组重建。return_counts表示返回数组a唯一值在原数组中出现的的个数。
可以同时使用多个return,但是无论输入顺序如何,输出顺序都是按 [唯一值、index、inverse、counts] 排列。
>>> a = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]])
>>> np.unique(a, axis=0)
array([[1, 0, 0], [2, 3, 4]]) >>> a = np.array(['a', 'b', 'b', 'c', 'a'])
>>> u, indices = np.unique(a, return_index=True)
>>> u
array(['a', 'b', 'c'])
>>> indices
array([0, 1, 3])
>>> a[indices]
array(['a', 'b', 'c']) >>> a = np.array([1, 2, 6, 4, 2, 3, 2])
>>> u, indices = np.unique(a, return_inverse=True)
>>> u
array([1, 2, 3, 4, 6])
>>> indices
array([0, 1, 4, 3, 1, 2, 1])
>>> u[indices]
array([1, 2, 6, 4, 2, 3, 2]) >>> u, indices = np.unique(a, return_counts=True)
>>> u
array([1, 3, 1, 1, 1]) >>> u,i,o = np.unique(a,return_counts=True,return_index=True, )
>>> u,i,o
(array([1, 2, 3, 4, 6]),
array([0, 1, 5, 3, 2]),
array([1, 3, 1, 1, 1])
参考:numpy中文文档:https://www.numpy.org.cn/reference/
numpy英文文档:https://numpy.org/doc/1.17/reference/index.html
iwehdio的博客园:https://www.cnblogs.com/iwehdio/
numpy的基本API(四)——拼接、拆分、添加、删除的更多相关文章
- 百度地图API示例之添加/删除工具条、比例尺控件
代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" cont ...
- Express4.x API (四):Router (译)
Express4.x API 译文 系列文章 Express4.x API (一):application (译) -- 进行 Express4.x API (二):request (译) -- 完成 ...
- TFS API : 四、工作项查询
TFS API : 四.工作项查询 本节将讲述如何查询工作项,将用户统计数据. 使用WorkItemStore.Query方法进行查询工作项,其使用的语法和SQL语法类似: Select [标题] f ...
- 【SSRS】入门篇(四) -- 向报表添加数据
原文:[SSRS]入门篇(四) -- 向报表添加数据 定义好数据集后 [SSRS]入门篇(三) -- 为报表定义数据集 ,就可以开始设计报表了,将要显示在报表的字段.文本框.图像和其他项从工具箱拖放到 ...
- C#/AutoCAD 2018/ObjectArx/二次开发添加删除实体的工具函数(四)
1.添加删除实体 C# ObjectARX二次开发添加删除实体是非常容易主要代码如下: 添加实体: objId = btr.AppendEntity(entity); trans.AddNewlyCr ...
- iOS仿网易新闻栏目拖动重排添加删除效果
仿网易新闻栏目选择页面的基本效果,今天抽了点时间教大家如何实现UICollectionView拖动的效果! 其实实现起来并不复杂,这里只是基本的功能,没有实现细节上的修改,连UI都是丑丑的样子,随手画 ...
- jqGrid添加删除功能(不和数据库交互)
jqGrid添加删除功能(不和数据库交互) 一.背景需求 项目中需要在前端页面动态的添加行,删除行,上下移动行等,同时还不和数据库交互.一直在用jqGrid展示表格的我们,从没有深入的研究过它,当然看 ...
- WPF下的Richtextbox中实现表格合并,添加删除行列等功能
.Net中已有现在的方法实现这些功能,不过可能是由于未完善,未把方法公开出来.只能用反射的方法去调用它. 详细信息可以查看.Net Framework 的源代码 http://referencesou ...
- tab一些 添加 删除 搜索
tab一些 添加 删除 搜索 案例 <!DOCTYPE html><html lang="en"><head> <meta charset ...
随机推荐
- RocketMQ 多副本前置篇:初探raft协议
目录 1.Leader选举 1.1 一轮投票中,只有一个节点发起投票的情况 1.2 一轮投票中,超过一个节点发起投票的情况 1.3 思考如何实现Raft选主 2.日志复制 Raft协议是分布式领域解决 ...
- 关于JAVA,特点,历史,编译式的语言&解释式的语言,什么是java?JDK?DOS?一次编译到处运行原理。
1.java语言的特点: 简单的:面向对象的:跨平台(操作系统)的(一次编译,到处运行):高性能的: 2.类名的首字母大写,方法小写: 3.历史: java2(即java),为什么加个2呢?1998年 ...
- CSS3选择器归类整理
CSS3选择器归类整理(附CSS优先级要点) CSS是用于网页设计可用的最强大的工具之一.使用它我们可以在几分钟内改变一个网站的界面,而不用改变页面的标签.在深入研究CSS选择器之前,我们应该先搞懂C ...
- udp协议以及socketserver
udb协议 udb协议也是一种协议,它和tcp相比既有缺点也有优点 udb协议所发送的数据可以理解为自带报头,所以他不会出现粘包的情况.但是udp数据只管发送而不管接收,也就是说udp会出现丢包的情况 ...
- 是时候考虑让你的Spark跑在K8S上了
[摘要] Spark社区在2.3版本开始,已经可以很好的支持跑着Kubernetes上了.这样对于统一资源池,提高整体资源利用率,降低运维成本(特别是技术栈归一)有着非常大的帮助.这些趋势是一个大数据 ...
- 你真的了解JMM吗?
引言 在现代计算机中,cpu的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cac ...
- Flink入门(三)——环境与部署
flink是一款开源的大数据流式处理框架,他可以同时批处理和流处理,具有容错性.高吞吐.低延迟等优势,本文简述flink在windows和linux中安装步骤,和示例程序的运行,包括本地调试环境,集群 ...
- [开源] .Net 使用 ORM 访问 达梦数据库
前言 武汉达梦数据库有限公司成立于2000年,为中国电子信息产业集团(CEC)旗下基础软件企业,专业从事数据库管理系统的研发.销售与服务,同时可为用户提供大数据平台架构咨询.数据技术方案规划.产品部署 ...
- (全国多校重现赛一) H Numbers
zk has n numbers a1,a2,...,ana1,a2,...,an. For each (i,j) satisfying 1≤i<j≤n, zk generates a new ...
- windows上安装和使用ab压测工具
ApacheBench是一款压力测试工具,用于测试http服务器请求的性能情况. 官方下载链接:https://www.apachehaus.com/cgi-bin/download.plx 百度云: ...