numpy.block
numpy.block(arrays) [source]
从块的嵌套列表中组装一个 nd-array。
最里面的列表中的块沿最后一个维度(-1)concatenate(请参阅concatenate),然后沿着倒数第二个维度(-2)进行concatenate,依此类推,直到到达最外面的列表。
Blocks可以是任何尺寸,但不会使用常规规则进行广播。 而是插入大小为1的引导轴,以使所有块的block.ndim
相同。 这主要用于处理标量,这意味着np.block([v,1])
之类的代码是有效的,其中v.ndim == 1
。
当嵌套列表深达两层时,这允许从其组件构造块矩阵。
1.13.0版中的新功能。
参数 : | arrays :array_like的nested list 或 scalars (但不是tuples) 如果传递单个ndarray或标量(深度为0的嵌套列表), 则将返回未修改的(且不会复制)。 元素形状必须沿适当的轴匹配(无广播), 但是将在必要时在形状前添加前导1,以使尺寸匹配。 |
返回值 : | block_array : 从给定的块组装而成的阵列。 输出的维度等于以下项中的最大值:
|
Raises : | ValueError 如果列表深度不匹配-例如, 应将其拼写为 例如, |
Notes
当仅使用标量调用时,np.block
等效于ndarray调用。 因此,np.block
([[[1,2],[3,4]])等同于np.array([[1,2],[3,4]])
。
此功能不强制块位于固定的网格上。np.block([[[a,b],[c,d]])
不限于以下形式的数组:
AAAbb
AAAbb
cccDD
但也可以为某些a,b,c,d
生成:
AAAbb
AAAbb
cDDDD
由于级联首先沿最后一个轴发生,因此block
不能直接产生以下结果:
AAAbb
cccbb
cccDD
Matlab的“方括号堆叠”,[A,B,...; p,q,...]
,等效于np.block([[A,B,...],[p,q,...]])
。
例子
1)将两个数组水平拼接
import numpy as np
# 将两个数组水平拼接
a = np.array([1, 2])
b = np.array([3, 4])
result = np.block([a, b])
print(result) # 输出: [1 2 3 4]
2)将两个数组垂直拼接
import numpy as np
# 将两个数组垂直拼接
a = np.array([[1], [2]])
b = np.array([[3], [4]])
result = np.block([[a], [b]])
print(result)
3)通过嵌套列表组合不同大小的数组
import numpy as np
a = np.array([[1, 2]])
b = np.array([[3]])
c = np.array([[4]])
result = np.block([[a, b], [np.zeros((1, 2)), c]])
print(result)
4)构建块矩阵
import numpy as np
# 定义矩阵 A 和 B
A = np.eye(2) * 2 # 2x2 单位矩阵乘以 2
B = np.eye(3) * 3 # 3x3 单位矩阵乘以 3
# 使用 np.block 构建块矩阵
result = np.block([
[A, np.zeros((2, 3))],
[np.ones((3, 2)), B ]
])
print(result)
5)使用 block 替代 hstack(水平堆叠)
import numpy as np
#简单的 1D 拼接
print(np.block([1, 2, 3])) # 相当于 hstack([1, 2, 3])
# 拼接数组和标量
a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
print(np.block([a, b, 10])) # 相当于 hstack([a, b, 10])
# 拼接 2D 矩阵
A = np.ones((2, 2), int)
B = 2 * A
print(np.block([A, B])) # 相当于 hstack([A, B])
6)使用 block 替代 vstack(垂直堆叠)
import numpy as np
# 垂直堆叠 1D 数组
a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
print(np.block([[a], [b]])) # 相当于 vstack([a, b])
# 垂直堆叠 2D 矩阵
A = np.ones((2, 2), int)
B = 2 * A
print(np.block([[A], [B]])) # 相当于 vstack([A, B])
7)使用 block 实现 atleast_1d 和 atleast_2d 功能
import numpy as np
# 将标量转换为至少 1D
a = np.array(0)
b = np.array([1])
print(np.block([a])) # 等同于 np.atleast_1d(a)
print(np.block([b])) # 等同于 np.atleast_1d(b)
# 将标量和数组转换为至少 2D
print(np.block([[a]])) # 等同于 np.atleast_2d(a)
print(np.block([[b]])) # 等同于 np.atleast_2d(b))