Numpy 数组:连接展平和添加维度
Posted 来西瓜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Numpy 数组:连接展平和添加维度相关的知识,希望对你有一定的参考价值。
到目前为止,我们已经在教程中学习了如何创建数组以及如何对 numpy 数组应用数值运算。 如果我们使用 numpy 编程,我们迟早会到达这一点,我们将需要函数来操作数组的形状或维度。 我们还将学习如何连接数组。 此外,我们将演示向现有数组添加维度的可能性以及如何堆叠多个数组。 我们将通过展示一种通过重复现有数组来构造新数组的简单方法来结束本章。
1 展平和重塑数组
有两种方法可以展平多维数组:flatten()和ravel()。
1.1 flatten()
flatten 是一个带有可选关键字参数“order”的ndarry 方法。 order 可以有值“C”、“F”和“A”。 顺序的默认值为“C”。 “C”表示以行优先顺序扁平化C风格,即最右边的索引“变化最快”,或者换句话说:在行优先顺序中,行索引变化最慢,列索引变化最快,所以 a[0,1] 跟在 a[0,0] 之后。“F”代表 Fortran 列优先排序。 “A”表示保留 C/Fortran 顺序。
import numpy as np
import numpy as np
A = np.array([[[0, 1],
[2, 3],
[4, 5],
[6, 7]],
[[8, 9],
[10, 11],
[12, 13],
[14, 15]],
[[16, 17],
[18, 19],
[20, 21],
[22, 23]]])
Flattened_X = A.flatten()
print(Flattened_X)
print(A.flatten(order="C"))
print(A.flatten(order="F"))
print(A.flatten(order="A"))
输出:
1.2 ravel()
ravel 返回一个扁平的一维数组。 仅在需要时制作副本。可选关键字参数“order”可以是“C”、“F”、“A”或“K”
- C:类 C 的顺序,最后一个轴索引变化最快,回到第一个轴索引变化最慢。 “C”是默认值!
- F:类似 Fortran 的索引顺序,第一个索引变化最快,最后一个索引变化最慢。
- A:如果数组“a”在内存中是 Fortran 连续的,则类似 Fortran 的索引顺序,否则类似 C 的顺序。
- K:按照它们在内存中出现的顺序读取元素,除了当步幅为负时反转数据。
print(A.ravel(order="A"))
print(A.ravel(order="F"))
print(A.ravel(order="A"))
print(A.ravel(order="K"))
输出:
1.3 reshape()
reshape() 方法在不更改其数据的情况下为数组提供新形状,即它返回具有新形状的新数组。
reshape(a, newshape, order=C)
- ‘a’:需要重塑形状的数组。
- ‘newshape’:整数或整数元组。
- ‘order’:C, F, ‘A’,与flatten与ravel的参数一样。
X = np.array(range(24))
Y = X.reshape((3, 4, 2))
输出:
2 连接数组
在下面的示例中,我们将三个一维数组连接到一个数组。 第二个数组的元素附加到第一个数组。 在此之后附加第三个数组的元素:
x = np.array([11, 22])
y = np.array([18, 7, 6])
z = np.array([1, 3, 5])
c = np.concatenate((x, y, z))
print(c)
输出:
如果我们连接多维数组,我们可以根据轴连接数组。 数组必须具有相同的形状才能与 concatenate() 连接。 在多维数组的情况下,我们可以按照轴来排列。 默认值为axis = 0:
x = np.array(range(24))
x = x.reshape((3, 4, 2))
y = np.array(range(100, 124))
y = y.reshape((3, 4, 2))
z = np.concatenate((x, y))
print(z)
输出:
我们现在用axis=1做同样的连接:
z = np.concatenate((x, y), axis=1)
输出:
3 添加新维度
可以使用切片和 np.newaxis 将新维度添加到数组中。 我们用一个例子来说明这种技术:
x = np.array([2, 5, 18, 14, 4])
y = x[:, np.newaxis]
print(y)
输出:
4 矢量堆叠
A = np.array([3, 4, 5])
B = np.array([1, 9, 0])
print(np.row_stack((A, B)))
print(np.column_stack((A, B)))
输出:
A = np.array([[3, 4, 5],
[1, 9, 0],
[4, 6, 8]])
print(np.column_stack((A, A, A)))
print(np.column_stack(A))
输出:
print(A[0])
print(np.column_stack((A[0], A[0], A[0])))
输出:
print(np.dstack((A, A, A)))
输出:
5 重复模式,“平铺”方法
有时,您希望或必须通过多次重复现有矩阵来创建新矩阵,以创建具有不同形状甚至尺寸的新矩阵。 例如,您可能有一个一维数组 array([ 3.4]) 并且您想将其转换为数组 array([ 3.4, 3.4, 3.4, 3.4, 3.4])。在另一个用例中,您可能有一个二维数组,例如 np.array([ [1, 2], [3, 4]]),您打算将其用作构建块来构造形状为 (6, 8):
array([[1, 2, 1, 2, 1, 2, 1, 2],
[3, 4, 3, 4, 3, 4, 3, 4],
[1, 2, 1, 2, 1, 2, 1, 2],
[3, 4, 3, 4, 3, 4, 3, 4],
[1, 2, 1, 2, 1, 2, 1, 2],
[3, 4, 3, 4, 3, 4, 3, 4]])
构建思路如下图所示:
如果这让你想起了给浴室或厨房铺瓷砖,那么你就走在了正确的轨道上:Numpy 为这项任务提供的功能称为“瓷砖”。tile 的正式语法如下所示:
np.tile(A, reps)
通过将 A 重复次数由 reps 给出的次数来构造数组。
“reps”通常是一个元组(或列表),它定义了沿相应轴/方向的重复次数。 例如,如果我们将 reps 设置为 (3, 4),则 A 将针对“行”重复 3 次,在列的方向上重复 4 次。 我们在以下示例中演示了这一点:
import numpy as np
x = np.array([[1, 2], [3, 4]])
print(np.tile(x, (3, 4)))
输出:
x = np.array([3.4])
y = np.tile(x, (5,))
print(y)
输出:
在前面的tile示例中,我们也可以写成 y = np.tile(x, 5)。
如果“reps”的长度为 n,则结果数组的维度将是 n 和 A.ndim 的最大值。
如果 A.ndim < n,则通过添加新轴将 A 提升为 n 维。 因此形状 (5,) 数组被提升为 (1, 5) 用于 2-D 复制,或形状 (1, 1, 5) 用于 3-D 复制。 如果这不是所需的行为,请在调用此函数之前手动将“A”提升为 n 维。
如果 A.ndim > d,reps 被提升为 A.ndim,方法是在它前面加上 1。因此对于形状为 (2, 3, 4, 5) 的数组 A,reps 的 (2, 2) 被视为 (1, 1, 2, 2)。进一步的例子:
x = np.array([[1, 2], [3, 4]])
print(np.tile(x, 2))
输出:
x = np.array([[1, 2], [3, 4]])
print(np.tile(x, (2, 1)))
输出:
x = np.array([[1, 2], [3, 4]])
print(np.tile(x, (2, 2)))
输出:
以上是关于Numpy 数组:连接展平和添加维度的主要内容,如果未能解决你的问题,请参考以下文章