numpy.block#

numpy.block(arrays)[原始碼]#

從區塊的巢狀清單組裝一個 nd-array。

最內層清單中的區塊會沿著最後一個維度 (-1) 串聯 (請參閱 concatenate),然後這些區塊會沿著倒數第二個維度 (-2) 串聯,依此類推,直到到達最外層清單。

區塊可以是任何維度,但不會使用一般規則進行廣播。相反地,會插入大小為 1 的前導軸,使所有區塊的 block.ndim 相同。這主要用於處理純量,並且表示像 np.block([v, 1]) 這樣的程式碼是有效的,其中 v.ndim == 1

當巢狀清單為兩層深時,這允許從其組件建構區塊矩陣。

參數:
arraysarray_like 或純量的巢狀清單 (但不是元組)

如果傳遞單個 ndarray 或純量 (深度為 0 的巢狀清單),則會傳回未修改的 (且未複製的)。

元素形狀必須沿適當的軸 (不進行廣播) 匹配,但會根據需要將前導 1 新增至形狀,以使維度匹配。

傳回:
block_arrayndarray

從給定區塊組裝的陣列。

輸出的維度等於以下各項的最大值

  • 所有輸入的維度

  • 輸入清單的巢狀深度

引發:
ValueError
  • 如果清單深度不匹配 - 例如,[[a, b], c] 是不合法的,應拼寫為 [[a, b], [c]]

  • 如果清單為空 - 例如,[[a, b], []]

另請參閱

concatenate

沿現有軸連接陣列序列。

stack

沿新軸連接陣列序列。

vstack

垂直 (逐列) 堆疊陣列序列。

hstack

水平 (逐行) 堆疊陣列序列。

dstack

深度方向 (沿第三軸) 堆疊陣列序列。

column_stack

將 1-D 陣列堆疊為 2-D 陣列中的列。

vsplit

將陣列垂直 (逐列) 分割成多個子陣列。

unstack

沿軸將陣列分割成子陣列的元組。

註解

當僅使用純量呼叫時,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, ...]])

範例

此函數最常見的用途是建構區塊矩陣

>>> import numpy as np
>>> 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([4, 5, 6])
>>> np.block([a, b, 10])             # hstack([a, b, 10])
array([ 1,  2,  3,  4,  5,  6, 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([4, 5, 6])
>>> np.block([[a], [b]])             # vstack([a, b])
array([[1, 2, 3],
       [4, 5, 6]])
>>> 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]])