- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Numpy中提供了concatenate,append, stack类(包括hsatck、vstack、dstack、row_stack、column_stack),r_和c_等类和函数用于数组拼接的操作.
各种函数的特点和区别如下标:
。
concatenate | 提供了axis参数,用于指定拼接方向 |
---|---|
append | 默认先ravel再拼接成一维数组,也可指定axis |
stack | 提供了axis参数,用于生成新的维度 |
hstack | 水平拼接,沿着行的方向,对列进行拼接 |
vstack | 垂直拼接,沿着列的方向,对行进行拼接 |
dstack | 沿着第三个轴(深度方向)进行拼接 |
column_stack | 水平拼接,沿着行的方向,对列进行拼接 |
row_stack | 垂直拼接,沿着列的方向,对行进行拼接 |
r_ | 垂直拼接,沿着列的方向,对行进行拼接 |
c_ | 水平拼接,沿着行的方向,对列进行拼接 |
。
0. 维度和轴 。
在正确理解Numpy中的数组拼接、合并操作之前,有必要认识下维度和轴的概念:
ndarray(多维数组)是Numpy处理的数据类型。多维数组的维度即为对应数据所在的空间维度,1维可以理解为直线空间,2维可以理解为平面空间,3维可以理解为立方体空间.
轴是用来对多维数组所在空间进行定义、描述的一组正交化的直线,根据数学惯例可以用 i , j , k i, j ,ki,j,k来表示.
在一维空间中,用一个轴就可以表示清楚,numpy中规定为axis 0,空间内的数可以理解为直线空间上的离散点 (x i ii, ).
在二维空间中,需要用两个轴表示,numpy中规定为axis 0和axis 1,空间内的数可以理解为平面空间上的离散点(x i ii,y j jj).
在三维空间中,需要用三个轴才能表示清楚,在二维空间的基础上numpy中又增加了axis 2,空间内的数可以理解为立方体空间上的离散点(x i ii,y j jj,z k kk).
Python中可以用numpy中的ndim和shape来分别查看维度,以及在对应维度上的长度。直观上可以根据符号“[ ]”的层数来判断,有m层即为m维,最外面1层对应axis0, 依次为axis1,axis2… 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
>>> a
=
np.array([
1
,
2
,
3
])
>>> a.ndim
# 一维数组
1
>>> a.shape
# 在这个维度上的长度为3
(
3
,)
>>> b
=
np.array([[
1
,
2
,
3
], [
4
,
5
,
6
]])
>>> b.ndim
# 二维数组
2
>>> b.shape
# 在axis 0 上的长度为2, 在axis 1上的长度为3.或者可以感性的理解为2行3列
(
2
,
3
)
>>> c
=
np.array([[[
1
,
2
,
3
], [
4
,
5
,
6
]]])
>>> c.ndim
# 三维数组
3
>>> c.shape
# 在axis 0 上的长度为1,在axis 1上的长度为2, 在axis 2上的长度为3. 或者可以感性的理解为1层2行3列
(
1
,
2
,
3
)
|
1. np.concatenate() 。
1
2
3
4
5
6
|
concatenate(a_tuple, axis
=
0
, out
=
None
)
"""
参数说明:
a_tuple:对需要合并的数组用元组的形式给出
axis: 沿指定的轴进行拼接,默认0,即第一个轴
"""
|
示例 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
>>>
import
numpy as np
>>> ar1
=
np.array([[
1
,
2
,
3
], [
4
,
5
,
6
]])
>>> ar2
=
np.array([[
7
,
8
,
9
], [
11
,
12
,
13
]])
>>> ar1
array([[
1
,
2
,
3
],
[
4
,
5
,
6
]])
>>> ar2
array([[
7
,
8
,
9
],
[
11
,
12
,
13
]])
>>> np.concatenate((ar1, ar2))
# 这里的第一轴(axis 0)是行方向
array([[
1
,
2
,
3
],
[
4
,
5
,
6
],
[
7
,
8
,
9
],
[
11
,
12
,
13
]])
>>> np.concatenate((ar1, ar2),axis
=
1
)
# 这里沿第二个轴,即列方向进行拼接
array([[
1
,
2
,
3
,
7
,
8
,
9
],
[
4
,
5
,
6
,
11
,
12
,
13
]])
>>> ar3
=
np.array([[
14
,
15
,
16
]])
# shape为(1,3)的2维数组
>>> np.concatenate((ar1, ar3))
# 一般进行concatenate操作的array的shape需要一致,当然如果array在拼接axis方向的size不一样,也可以完成
>>> np.concatenate((ar1, ar3))
# ar3虽然在axis0方向的长度不一致,但axis1方向上一致,所以沿axis0可以拼接
array([[
1
,
2
,
3
],
[
4
,
5
,
6
],
[
14
,
15
,
16
]])
>>> np.concatenate((ar1, ar3), axis
=
1
)
# ar3和ar1在axis0方向的长度不一致,所以报错
|
2. pd.append() 。
1
2
3
4
5
6
7
8
|
append(arr, values, axis
=
None
)
"""
参数说明:
arr:array_like的数据
values: array_like的数据,若axis为None,则先将arr和values进行ravel扁平化,再拼接;否则values应当与arr的shape一致,或至多
在拼接axis的方向不一致
axis:进行append操作的axis的方向,默认无
"""
|
示例 。
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> np.append(ar1, ar2)
# 先ravel扁平化再拼接,所以返回值为一个1维数组
array([
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
11
,
12
,
13
])
>>> np.append(ar1, ar2, axis
=
0
)
# 沿第一个轴拼接,这里为行的方向
array([[
1
,
2
,
3
],
[
4
,
5
,
6
],
[
7
,
8
,
9
],
[
11
,
12
,
13
]])
>>> np.append(ar1, ar2, axis
=
1
)
# 沿第二个轴拼接,这里为列的方向
array([[
1
,
2
,
3
,
7
,
8
,
9
],
[
4
,
5
,
6
,
11
,
12
,
13
]])
|
3. np.stack() 。
1
2
3
4
5
|
stack(arrays, axis
=
0
, out
=
None
)
"""
沿着指定的axis对arrays(每个array的shape必须一样)进行拼接,返回值的维度比原arrays的维度高1
axis:默认为0,即第一个轴,若为-1即为第二个轴
"""
|
示例 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
>>> np.stack((ar1, ar2))
# 增加第一个维度(axis0,之后的axis向后顺延:0—>1, 1—>2)
array([[[
1
,
2
,
3
],
[
4
,
5
,
6
]],
[[
7
,
8
,
9
],
[
11
,
12
,
13
]]])
>>> np.stack((ar1, ar2), axis
=
1
)
# 增加第二个维度(axis1,之后的axis向后顺延, 1—>2)
array([[[
1
,
2
,
3
],
[
7
,
8
,
9
]],
[[
4
,
5
,
6
],
[
11
,
12
,
13
]]])
>>> np.stack((ar1, ar2), axis
=
2
)
# 增加第三个维度(axis2,和axis=-1的效果一样,原来的axis0和axis1保持不变)
array([[[
1
,
7
],
[
2
,
8
],
[
3
,
9
]],
[[
4
,
11
],
[
5
,
12
],
[
6
,
13
]]])
|
关于维度增加的一种理解方式 。
4. hstack、vstack和vstack 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
>>> np.hstack((ar1,ar2))
# 水平拼接,沿着行的方向,对列进行拼接
array([[
1
,
2
,
3
,
7
,
8
,
9
],
[
4
,
5
,
6
,
11
,
12
,
13
]])
>>> np.vstack((ar1,ar2))
# 垂直拼接,沿着列的方向,对行进行拼接
array([[
1
,
2
,
3
],
[
4
,
5
,
6
],
[
7
,
8
,
9
],
[
11
,
12
,
13
]])
>>> np.dstack((ar1,ar2))
# 对于2维数组来说,沿着第三轴(深度方向)进行拼接, 效果相当于stack(axis=-1)
array([[[
1
,
7
],
[
2
,
8
],
[
3
,
9
]],
[[
4
,
11
],
[
5
,
12
],
[
6
,
13
]]])
|
5. column_stack和row_stack 。
1
2
3
4
5
6
7
8
9
|
>>> np.column_stack((ar1,ar2))
# 水平拼接,沿着行的方向,对列进行拼接
array([[
1
,
2
,
3
,
7
,
8
,
9
],
[
4
,
5
,
6
,
11
,
12
,
13
]])
>>> np.row_stack((ar1,ar2))
# 垂直拼接,沿着列的方向,对行进行拼接
array([[
1
,
2
,
3
],
[
4
,
5
,
6
],
[
7
,
8
,
9
],
[
11
,
12
,
13
]])
|
6. np.r_ 和np.c_ 。
常用于快速生成ndarray数据 。
1
2
3
4
5
6
7
8
9
|
>>> np.r_[ar1,ar2]
# 垂直拼接,沿着列的方向,对行进行拼接
array([[
1
,
2
,
3
],
[
4
,
5
,
6
],
[
7
,
8
,
9
],
[
11
,
12
,
13
]])
>>> np.c_[ar1,ar2]
# 水平拼接,沿着行的方向,对列进行拼接
array([[
1
,
2
,
3
,
7
,
8
,
9
],
[
4
,
5
,
6
,
11
,
12
,
13
]])
|
7. 总结 。
对于两个shape一样的二维array来说
增加行(对行进行拼接)的方法有:
1
2
3
4
5
|
np.concatenate((ar1, ar2),axis
=
0
)
np.append(ar1, ar2, axis
=
0
)
np.vstack((ar1,ar2))
np.row_stack((ar1,ar2))
np.r_[ar1,ar2]
|
增加列(对列进行拼接)的方法有:
1
2
3
4
5
|
np.concatenate((ar1, ar2),axis
=
1
)
np.append(ar1, ar2, axis
=
1
)
np.hstack((ar1,ar2))
np.column_stack((ar1,ar2))
np.c_[ar1,ar2]
|
相关代码可见:https://github.com/guofei1989/python_func_cases/tree/master/numpy_demos 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/guofei_fly/article/details/85485173 。
最后此篇关于详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)的文章就讲到这里了,如果你想了解更多关于详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有 SwiftUI 的问题。当我使用多个 VStack s 在另一个 VStack ,我在文本截断方面遇到了奇怪的问题。 这是最小的可重现示例: “B”标签被截断,但它不应该被截断。如果我通过添加或
我正在尝试构建一个包含多个 VStack(元素)的 VStack(容器),每个 VStack 都有一个标题和一个文本。元素 VStack 应该均匀分布,并且之间有间隔。 由于某种原因,它最多只能工作
有人可以告诉我这条 ffmpeg 行有什么问题吗?我收到错误: 输入 1 宽度 619 与输入 0 宽度 618 不匹配。 无法在 Parsed_vstack_3 上配置输出焊盘 重新初始化过滤器时出
我最近一直在 SwiftUI 中构建一个应用程序,今天我注意到 VStack Alignment 有一些奇怪的行为。无论我使用什么对齐方式, View 都不会在中心之外对齐。见下文: VStack(a
我想将 VStack 的内容左对齐而不是居中,但我不知道该怎么做。这是我的代码: struct SortRow: View { var sortType: SortType @AppS
我想将 VStack 的内容左对齐而不是居中,但我不知道该怎么做。这是我的代码: struct SortRow: View { var sortType: SortType @AppS
我从一个干净的项目开始,在 VStack 中添加了 5 个按钮和 5 个垫片,一切都很好。当我在底部添加第 6 个间隔时,代码突然无法编译并出现错误:“对成员'buildBlock()'的不明确引用”
这个问题已经有答案了: 奥 git _a (1 个回答) 已关闭 4 年前。 我想从 numpy 数组列表中创建一个 numpy 数组。假设我们有三个数组 a 、 b 、 c(嗯,实际上我的代码列表中
我在使用 SwiftUI 创建一些 View 时遇到了 VStack 框架尺寸的奇怪错误。渐变不会填满屏幕的所有高度。那只是 Xcode 错误还是我做错了什么? struct WelcomeView
尽管在预览版中 VStack 看起来很有希望,但当我在模拟器或手机上运行该应用程序时,它似乎低于预期。通过比较两个图像,您可以看到在 View 的前部有很大的差距。我还添加了层的图像以帮助您理解问题。
我正在尝试构建一个简单的视频编辑器,并在后台使用 ffmpeg。我想在一个命令中使用尽可能多的不同过滤器/属性,但我没有成功地将静止图像放在其他所有内容之前(第一帧)。在视频中显示图像后,我想要一个
我想堆叠 4 个视频,如下面的代码和 添加循环 例如,对于较短的 top_left.mp4。 我找不到添加循环选项而不会出错的方法。 请问你能帮帮我吗? ffmpeg -i top_left.mp4
我有一个卡片 View 。我给自己的尺寸。我知道这是错误的。我想调整大小并除以百分比,如 blue = 70% & red = 30%或类似的东西。但不知道怎么做。我是新来的 SwiftUI .下面是
我是 SwiftUI 的新手,这次我尝试将单个元素(图像)向右对齐,然后其余内容应居中对齐。 就像使用 Spacer() 时发生的情况一样在 HStack 上但到另一边。 我读到了 .alignmen
我正在编写一个函数来从图像中读取像素数据并将它们存储在 numpy 数组中,以进一步进行训练/测试分割。 当我运行此代码时,它会抛出一个异常,表示除串联轴之外的所有输入数组维度都必须完全匹配。 我不确
我有一个简单的 View ,其中包含一个VStack,其中一行文本包含列表标题(认为标题),后跟一个List。 struct CampaignView : View { let campaign:
我在将 numpy vstack 用于指数为 e-5 的浮点值时遇到问题。 item_array 和 date_array 都是 numpy.ndarray。 当我使用 data = np.vstac
我正在监视串行端口并尝试在数据到达时在 Matplotlib 中绘制数据。因为数据以不规则的间隔到达,所以我使用一种方法来附加数据 - 类似于 this thread . 这是我的代码: data =
我有 vstacked 图像数据,现在我希望将其拆分为训练集和测试集。但是如何初始化一个空的 numpy 数组以便我可以开始 vstacking? 我的简化代码如下所示: #k-fold the da
若干个数组可以沿不同的轴合合并到一起,vstack,hstack的简单用法, ?
我是一名优秀的程序员,十分优秀!