数组的堆叠与拼接:`hstack`, `vstack`, `concatenate`

好的,各位听众,欢迎来到“数组堆叠与拼接:hstack, vstack, concatenate 的爱恨情仇”讲座现场!我是你们的导游兼段子手,今天就带大家一起扒一扒 NumPy 数组堆叠的那些事儿。准备好了吗?系好安全带,我们要起飞啦!🚀

开场白:数组,数据世界的积木

在数据科学的浩瀚宇宙中,NumPy 数组就像乐高积木,是我们构建复杂数据结构的基础。它们整齐排列,存储着各种各样的数据,等待着我们去操控、分析。而数组的堆叠与拼接,就像是用这些积木搭建更宏伟的建筑,让我们能够将分散的数据片段组合成完整的、有意义的信息。

今天我们要聊的主角 hstack, vstack, 和 concatenate,正是负责数组堆叠的“三剑客”。它们各有千秋,功能相似却又略有不同,掌握它们,你就能在数据处理的道路上如鱼得水,效率倍增。

第一幕:hstack – 横向拓展的魔术师

首先登场的是 hstack,它的名字就暗示了它的拿手好戏:水平方向的堆叠。你可以把它想象成一个熟练的木匠,将一块块木板横向拼接起来,最终形成一块更宽的木板。

基本用法:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

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

这段代码就像变魔术一样,hstackab 两个数组“横向”连接起来,形成了一个新的数组 c。是不是很简单?

更高级的玩法:

hstack 的魅力远不止于此。它可以处理多维数组,只要保证在水平方向上,数组的行数(也就是第一个维度的大小)相同即可。

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

c = np.hstack((a, b))
print(c)
# 输出:
# [[1 2 5 6]
#  [3 4 7 8]]

看到没?hstackab 两个二维数组横向拼接,就像把两张表格左右合并一样。表格的第一列变成了 [1, 3],第二列变成了 [2, 4],然后紧接着是 [5, 7][6, 8]

注意事项:

  • hstack 要求被堆叠的数组,除了水平方向(列数)之外,其他维度的大小必须一致。否则,NumPy 会毫不留情地抛出一个 ValueError
  • 对于一维数组,hstack 的效果和 concatenate((a, b), axis=1) 是一样的。

总结:

hstack 就像一个横向拓展的魔术师,擅长将数组在水平方向上拼接起来。它简单易用,适用于各种需要横向合并数据的场景。

第二幕:vstack – 垂直叠加的建筑师

接下来,我们请出第二位主角:vstack。与 hstack 专注于横向拓展不同,vstack 是一位垂直叠加的建筑师,它会将数组在垂直方向上堆叠起来,就像用砖头一层一层地盖房子。

基本用法:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

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

vstackab 两个数组“垂直”堆叠起来,形成了一个新的二维数组 c。每一行对应一个原始数组,是不是很直观?

更高级的玩法:

vstack 同样可以处理多维数组,只要保证在垂直方向上,数组的列数(也就是第二个维度的大小)相同即可。

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

c = np.vstack((a, b))
print(c)
# 输出:
# [[1 2]
#  [3 4]
#  [5 6]
#  [7 8]]

vstackab 两个二维数组垂直拼接,就像把两张表格上下拼接一样。第一行变成了 [1, 2],第二行变成了 [3, 4],然后紧接着是 [5, 6][7, 8]

注意事项:

  • vstack 要求被堆叠的数组,除了垂直方向(行数)之外,其他维度的大小必须一致。否则,NumPy 会毫不留情地抛出一个 ValueError
  • 对于一维数组,vstack 的效果和 concatenate((a, b), axis=0) 是一样的。

总结:

vstack 就像一个垂直叠加的建筑师,擅长将数组在垂直方向上堆叠起来。它简单易用,适用于各种需要纵向合并数据的场景。

第三幕:concatenate – 灵活多变的变形金刚

最后,我们隆重推出今天的压轴嘉宾:concatenate。它是一位灵活多变的变形金刚,可以沿着任意指定的轴(axis)进行数组的拼接,功能最为强大,也最为复杂。

基本用法:

concatenate 的基本用法需要指定一个 axis 参数,表示沿着哪个轴进行拼接。axis=0 表示沿着垂直方向(行),axis=1 表示沿着水平方向(列)。

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

c = np.concatenate((a, b), axis=0)  # 沿着垂直方向拼接
print(c)
# 输出:
# [[1 2]
#  [3 4]
#  [5 6]
#  [7 8]]

d = np.concatenate((a, b), axis=1)  # 沿着水平方向拼接
print(d)
# 输出:
# [[1 2 5 6]
#  [3 4 7 8]]

看到没?通过改变 axis 参数,concatenate 可以实现与 vstackhstack 类似的效果。

更高级的玩法:

concatenate 的强大之处在于它可以处理任意维度的数组,只要保证除了拼接轴之外,其他维度的大小一致即可。

a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])  # (2, 2, 2)
b = np.array([[[9, 10], [11, 12]], [[13, 14], [15, 16]]])  # (2, 2, 2)

c = np.concatenate((a, b), axis=0)  # (4, 2, 2)
print(c.shape)  # 输出:(4, 2, 2)

d = np.concatenate((a, b), axis=1)  # (2, 4, 2)
print(d.shape)  # 输出:(2, 4, 2)

e = np.concatenate((a, b), axis=2)  # (2, 2, 4)
print(e.shape)  # 输出:(2, 2, 4)

这段代码展示了 concatenate 在三维数组上的应用。通过改变 axis 参数,我们可以沿着不同的轴进行拼接,得到不同形状的数组。

注意事项:

  • concatenate 要求被拼接的数组,除了拼接轴之外,其他维度的大小必须一致。
  • axis 参数必须是一个整数,表示拼接轴的索引。
  • concatenate 的灵活性使其成为处理复杂数组拼接的首选工具。

总结:

concatenate 就像一个灵活多变的变形金刚,可以沿着任意指定的轴进行数组的拼接。它功能强大,适用性广,是处理复杂数组拼接的利器。

三剑客的比较:爱恨情仇的纠葛

既然介绍了三位主角,就不得不比较一下它们的优缺点,以及适用场景。

功能 hstack vstack concatenate
水平拼接 axis=1
垂直拼接 axis=0
任意轴拼接
易用性
灵活性

适用场景:

  • hstack 适用于需要简单横向拼接数组的场景,例如将两个表格左右合并。
  • vstack 适用于需要简单纵向拼接数组的场景,例如将两个表格上下合并。
  • concatenate 适用于需要沿着任意轴进行拼接的复杂场景,例如处理多维数组的拼接。

选择建议:

  • 如果只需要简单的横向或纵向拼接,hstackvstack 是更简洁的选择。
  • 如果需要处理复杂的多维数组拼接,或者需要沿着非 0 或 1 的轴进行拼接,concatenate 是唯一的选择。

实际案例:图像处理中的应用

为了让大家更好地理解数组堆叠的应用,我们来看一个图像处理的例子。假设我们有两张灰度图像,分别存储在两个 NumPy 数组中,我们想将它们拼接成一张更大的图像。

import numpy as np
import matplotlib.pyplot as plt

# 创建两张简单的灰度图像
img1 = np.random.randint(0, 256, size=(100, 100), dtype=np.uint8)
img2 = np.random.randint(0, 256, size=(100, 100), dtype=np.uint8)

# 横向拼接
img_hstack = np.hstack((img1, img2))

# 纵向拼接
img_vstack = np.vstack((img1, img2))

# 显示图像
plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)
plt.imshow(img_hstack, cmap='gray')
plt.title('hstack')

plt.subplot(1, 2, 2)
plt.imshow(img_vstack, cmap='gray')
plt.title('vstack')

plt.show()

这段代码首先创建了两张随机的灰度图像,然后使用 hstackvstack 将它们分别横向和纵向拼接起来。最后,我们使用 matplotlib 将拼接后的图像显示出来。

通过这个例子,我们可以看到数组堆叠在图像处理中的应用:可以将多张图像拼接成一张更大的图像,方便我们进行观察和分析。

结语:掌握堆叠技巧,解锁数据潜力

掌握 NumPy 数组的堆叠与拼接技巧,就像掌握了一把开启数据宝藏的钥匙。hstack, vstack, 和 concatenate 各有所长,各有千秋,选择合适的工具,可以让你在数据处理的道路上事半功倍。

希望今天的讲座能帮助大家更好地理解数组堆叠的原理和应用。记住,数据科学的乐趣在于探索和创造,掌握这些基础工具,你就能构建出更复杂、更强大的数据应用!

感谢大家的聆听!下次再见!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注