开发手册 欢迎您!
软件开发者资料库

Python numpy.block函数方法的使用

NumPy(Numerical Python的缩写)是一个开源的Python科学计算库。使用NumPy,就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍一下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]])不限于以下形式的数组:

AAAbbAAAbbcccDD

但也可以为某些a,b,c,d生成:

AAAbbAAAbbcDDDD

由于级联首先沿最后一个轴发生,因此block不能直接产生以下结果:

AAAbbcccbbcccDD

Matlab的“方括号堆叠”,[A,B,...; p,q,...],等效于np.block([[A,B,...],[p,q,...]])

例子

此功能最常见的用途是构建块矩阵

>>> A = np.eye(2) * 2>>> B = np.eye(3) * 3>>> np.block([...     [A,               np.zeros((2, 3))],...     [np.ones((3, 2)), B               ]... ])array([[2., 0., 0., 0., 0.],       [0., 2., 0., 0., 0.],       [1., 1., 3., 0., 0.],       [1., 1., 0., 3., 0.],       [1., 1., 0., 0., 3.]])

具有深度1的列表,block可用作hstack

>>> np.block([1, 2, 3])              # hstack([1, 2, 3])array([1, 2, 3])
>>> a = np.array([1, 2, 3])>>> b = np.array([2, 3, 4])>>> np.block([a, b, 10])             # hstack([a, b, 10])array([ 1,  2,  3,  2,  3,  4, 10])
>>> A = np.ones((2, 2), int)>>> B = 2 * A>>> np.block([A, B])                 # hstack([A, B])array([[1, 1, 2, 2],       [1, 1, 2, 2]])

具有深度2的列表,可以使用block代替vstack

>>> a = np.array([1, 2, 3])>>> b = np.array([2, 3, 4])>>> np.block([[a], [b]])             # vstack([a, b])array([[1, 2, 3],       [2, 3, 4]])
>>> A = np.ones((2, 2), int)>>> B = 2 * A>>> np.block([[A], [B]])             # vstack([A, B])array([[1, 1],       [1, 1],       [2, 2],       [2, 2]])

也可以在atleast_1datleast_2d的地方使用

>>> a = np.array(0)>>> b = np.array([1])>>> np.block([a])                    # atleast_1d(a)array([0])>>> np.block([b])                    # atleast_1d(b)array([1])
>>> np.block([[a]])                  # atleast_2d(a)array([[0]])>>> np.block([[b]])                  # atleast_2d(b)array([[1]])