bundles / numpy latest / numpy / choose
_ArrayFunctionDispatcher
numpy:choose
source: /dev/numpy/build-install/usr/lib/python3.14/site-packages/numpy/_core/fromnumeric.py :308
Signature
def choose ( a , choices , out = None , mode = raise ) Summary
Construct an array from an index array and a list of arrays to choose from.
Extended Summary
First of all, if confused or uncertain, definitely look at the Examples - in its full generality, this function is less simple than it might seem from the following code description
np.choose(a,c) == np.array([c[a[I]][I] for I in np.ndindex(a.shape)])But this omits some subtleties. Here is a fully general summary:
Given an "index" array (a) of integers and a sequence of n arrays (choices), a and each choice array are first broadcast, as necessary, to arrays of a common shape; calling these Ba and Bchoices[i], i =
0,...,n-1 we have that, necessarily, Ba.shape == Bchoices[i].shape for each i. Then, a new array with shape Ba.shape is created as follows:
if
mode='raise'(the default), then, first of all, each element ofa(and thusBa) must be in the range[0, n-1]; now, suppose thati(in that range) is the value at the(j0, j1, ..., jm)position inBa- then the value at the same position in the new array is the value inBchoices[i]at that same position;if
mode='wrap', values ina(and thusBa) may be any (signed) integer; modular arithmetic is used to map integers outside the range[0, n-1]back into that range; and then the new array is constructed as above;if
mode='clip', values ina(and thusBa) may be any (signed) integer; negative integers are mapped to 0; values greater thann-1are mapped ton-1; and then the new array is constructed as above.
Parameters
a: int arrayThis array must contain integers in
[0, n-1], wherenis the number of choices, unlessmode=wrapormode=clip, in which cases any integers are permissible.choices: sequence of arraysChoice arrays.
aand all of the choices must be broadcastable to the same shape. Ifchoicesis itself an array (not recommended), then its outermost dimension (i.e., the one corresponding tochoices.shape[0]) is taken as defining the "sequence".out: array, optionalIf provided, the result will be inserted into this array. It should be of the appropriate shape and dtype. Note that
outis always buffered ifmode='raise'; use other modes for better performance.mode: {'raise' (default), 'wrap', 'clip'}, optionalSpecifies how indices outside
[0, n-1]will be treated:'raise'an exception is raised
'wrap'value becomes value mod
n'clip'values < 0 are mapped to 0, values > n-1 are mapped to n-1
Returns
merged_array: arrayThe merged result.
Raises
: ValueError: shape mismatchIf
aand each choice array are not all broadcastable to the same shape.
Notes
To reduce the chance of misinterpretation, even though the following "abuse" is nominally supported, choices should neither be, nor be thought of as, a single array, i.e., the outermost sequence-like container should be either a list or a tuple.
Examples
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. ) np.choose([2, 4, 1, 0], choices, mode='clip') # 4 goes to 3 (4-1) np.choose([2, 4, 1, 0], choices, mode='wrap') # 4 goes to (4 mod 4)✓
a = [[1, 0, 1], [0, 1, 0], [1, 0, 1]] choices = [-10, 10] np.choose(a, choices)✓
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
✗See also
- ndarray.choose
equivalent method
- numpy.take_along_axis
Preferable if
choicesis an array
Aliases
-
numpy.choose