numpy.choose#

numpy.choose(a, choices, out=None, mode='raise')[source]#

從索引陣列和要選擇的陣列列表建構一個陣列。

首先,如果感到困惑或不確定,務必查看「範例」章節 - 從完整性來看,此函數不如從以下程式碼描述中看起來那麼簡單

np.choose(a,c) == np.array([c[a[I]][I] for I in np.ndindex(a.shape)])

但這省略了一些細微之處。以下是一個完整的通用摘要

給定一個整數「索引」陣列 (a) 和一個 n 個陣列的序列 (choices),a 和每個選擇陣列會先廣播(如有必要)到具有相同形狀的陣列;將這些稱為 BaBchoices[i], i = 0,…,n-1,我們必然有 Ba.shape == Bchoices[i].shape 對於每個 i。然後,會按照以下方式建立一個形狀為 Ba.shape 的新陣列

  • 如果 mode='raise'(預設值),那麼,首先,a(以及 Ba)的每個元素都必須在範圍 [0, n-1] 內;現在,假設 i(在該範圍內)是 Ba(j0, j1, ..., jm) 位置的值 - 那麼新陣列中相同位置的值就是 Bchoices[i] 在該相同位置的值;

  • 如果 mode='wrap'a(以及 Ba)中的值可以是任何(帶符號)整數;模組化算術用於將範圍 [0, n-1] 之外的整數映射回該範圍內;然後以上述方式建構新陣列;

  • 如果 mode='clip'a(以及 Ba)中的值可以是任何(帶符號)整數;負整數會映射到 0;大於 n-1 的值會映射到 n-1;然後以上述方式建構新陣列。

參數:
a整數陣列

此陣列必須包含 [0, n-1] 範圍內的整數,其中 n 是選擇的數量,除非 mode=wrapmode=clip,在這些情況下,任何整數都是允許的。

choices陣列序列

選擇陣列。a 和所有選擇陣列必須可廣播到相同的形狀。如果 choices 本身是一個陣列(不建議),則其最外層維度(即,對應於 choices.shape[0] 的維度)將被視為定義「序列」。

out陣列,選用

如果提供,結果將插入到此陣列中。它應該具有適當的形狀和 dtype。請注意,如果 mode='raise',則 out 始終會被緩衝;使用其他模式以獲得更好的效能。

mode{‘raise’ (預設), ‘wrap’, ‘clip’}, 選用

指定如何處理 [0, n-1] 範圍外的索引

  • ‘raise’ : 引發例外

  • ‘wrap’ : 值變為 值 mod n

  • ‘clip’ : 值 < 0 會映射到 0,值 > n-1 會映射到 n-1

回傳值:
merged_array陣列

合併後的結果。

引發:
ValueError: 形狀不符

如果 a 和每個選擇陣列並非都可廣播到相同的形狀。

另請參閱

ndarray.choose

等效方法

numpy.take_along_axis

如果 choices 是一個陣列,則更佳

說明

為了減少誤解的可能性,即使名義上支援以下「濫用」方式,choices 也不應該是單個陣列,也不應被視為單個陣列,也就是說,最外層的序列式容器應該是列表或元組。

範例

>>> import numpy as np
>>> choices = [[0, 1, 2, 3], [10, 11, 12, 13],
...   [20, 21, 22, 23], [30, 31, 32, 33]]
>>> np.choose([2, 3, 1, 0], choices
... # the first element of the result will be the first element of the
... # third (2+1) "array" in choices, namely, 20; the second element
... # will be the second element of the fourth (3+1) choice array, i.e.,
... # 31, etc.
... )
array([20, 31, 12,  3])
>>> np.choose([2, 4, 1, 0], choices, mode='clip') # 4 goes to 3 (4-1)
array([20, 31, 12,  3])
>>> # because there are 4 choice arrays
>>> np.choose([2, 4, 1, 0], choices, mode='wrap') # 4 goes to (4 mod 4)
array([20,  1, 12,  3])
>>> # i.e., 0

幾個範例說明 choose 如何廣播

>>> a = [[1, 0, 1], [0, 1, 0], [1, 0, 1]]
>>> choices = [-10, 10]
>>> np.choose(a, choices)
array([[ 10, -10,  10],
       [-10,  10, -10],
       [ 10, -10,  10]])
>>> # With thanks to Anne Archibald
>>> a = np.array([0, 1]).reshape((2,1,1))
>>> c1 = np.array([1, 2, 3]).reshape((1,3,1))
>>> c2 = np.array([-1, -2, -3, -4, -5]).reshape((1,1,5))
>>> np.choose(a, (c1, c2)) # result is 2x3x5, res[0,:,:]=c1, res[1,:,:]=c2
array([[[ 1,  1,  1,  1,  1],
        [ 2,  2,  2,  2,  2],
        [ 3,  3,  3,  3,  3]],
       [[-1, -2, -3, -4, -5],
        [-1, -2, -3, -4, -5],
        [-1, -2, -3, -4, -5]]])