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的嵌套列表),则将返回未修改的(且不会复制)。 |
返回值: | block_array: : ndarray
从给定的块组装而成的阵列。 |
异常: | ValueError:
如果列表深度不匹配-例如,[[a, b], c]是非法的,应该拼写[[a, b], [c]] |
注意:
当仅使用标量调用时,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.]])
>>> 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]])
>>> 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]])