numpy block 用法及代码示例

用法:
numpy.block(arrays)
从块的嵌套列表中组装nd-array。

最里面的列表中的块是串联的(请参阅concatenate)沿最后一个维度(-1),然后将它们沿second-last维度(-2)串联,依此类推,直到到达最外面的列表。

块可以是任何尺寸,但不会使用常规规则进行广播。而是插入尺寸为1的引导轴,以使block.ndim所有块都一样。这对于处理标量主要有用,并且意味着类似np.block([v, 1])有效的地方v.ndim == 1。

当嵌套列表深达两层时,这允许从其组件构造块矩阵。

1.13.0版中的新功能。

描述
参数 arrays: : nested list of array_like 或 scalars (but not tuples)

如果传递单个ndarray或标量(深度为0的嵌套列表),则将返回未修改的(且不会复制)。
元素形状必须沿适当的轴匹配(不广播),但是将在必要时在形状前添加前导1,以使尺寸匹配。

返回值: block_array: : ndarray

从给定的块组装而成的阵列。
输出的维度等于以下项中的最大值:*所有输入的维度*输入列表嵌套的深度

异常: ValueError:

如果列表深度不匹配-例如,[[a, b], c]是非法的,应该拼写[[a, b], [c]]
如果列表为空-例如,[[a, b], []]

注意:

当仅使用标量调用时,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的“square bracket stacking”,[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]])

带有深度清单2block可以代替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]])

发表回复

登录... 后才能评论