Python numpy.block函数方法的使用

numpy.block 函数用于构建一个新的数组,它可以将子数组按块状方式拼接组合成一个大数组。numpy.block 的输入是一个嵌套的列表(或元组),通过该列表定义子数组的排列方式。本文主要介绍一下NumPy中block方法的使用。

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_arrayndarray

从给定的块组装而成的阵列。

 输出的维度等于以下项中的最大值:

*所有输入的维度*输入列表嵌套的深度

Raises :

ValueError

如果列表深度不匹配-例如,[[[a,b],c]是非法的,

应将其拼写为[[a,b],[c]] 如果列表为空

例如,[[[a,b],[]]

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))

推荐阅读
cjavapy编程之路首页