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]])
不限于以下形式的数组:
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_1d和atleast_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]])