With my code I'm running into an issue where the numpy.choose methods does not accept all the arguments since it is limited by NPY_MAXARGS (=32). Is there an alternative available, that allows an arbitrary number of argument arrays or at least more than 32 that is as fast as numpy.choose?
choices = [np.arange(0,100)]*100
selection = [0] * 100
np.choose(selection, choices)
>> ValueError: Need between 2 and (32) array objects (inclusive).
Any help would be appreciated... :)
Iterate over numpy with index (numpy equivalent of python enumerate)
save() numpy. save() function is used to store the input array in a disk file with npy extension(. npy).
NumPy random. choice() function in Python is used to return a random sample from a given 1-D array. It creates an array and fills it with random samples. It has four parameters and using these parameters we can manipulate the random samples of an array.
We can create a NumPy ndarray object by using the array() function.
The indices can be given as lists. Assuming that selections has the same length as choices:
b = numpy.array(choices)
result = b[range(len(selections)), selections]
will give the value in choices specified by the index in selections. See it in action:
numpy.random.seed(1)
b = numpy.random.randint(0,100,(5,10))
>>> array([[37, 12, 72, 9, 75, 5, 79, 64, 16, 1],
[76, 71, 6, 25, 50, 20, 18, 84, 11, 28],
[29, 14, 50, 68, 87, 87, 94, 96, 86, 13],
[ 9, 7, 63, 61, 22, 57, 1, 0, 60, 81],
[ 8, 88, 13, 47, 72, 30, 71, 3, 70, 21]])
selections = numpy.random.randint(0,10,5)
>>> array([1, 9, 3, 4, 8])
result = b[range(len(selections)),selections]
>>>> array([12, 28, 68, 22, 70])
choose has the 32 object limit because it broadcasts the arrays together. Consider the error messages for these two actions:
In [982]: np.arange(33).choose(np.ones((33,33)))
...
ValueError: Need at least 1 and at most 32 array objects.
In [983]: np.broadcast(*range(33))
...
ValueError: Need at least 1 and at most 32 array objects.
An example exploiting that broadcasting, picking values from a 2d array, 1d and scalar.
In [998]: np.diag([2,1,0]).choose((np.arange(9).reshape(3,3), 0,[.1,.2,.3]))
Out[998]:
array([[ 0.1, 1. , 2. ],
[ 3. , 0. , 5. ],
[ 6. , 7. , 8. ]])
As @Benjamin shows np.choose can be used to select items from the successive columns of a 2d array - provided there aren't more than 32 columns
In [1002]: M=np.arange(9).reshape(3,3)
In [1003]: np.array([2,0,1]).choose(M)
Out[1003]: array([6, 1, 5])
In [1004]: M[[2,0,1],[0,1,2]]
Out[1004]: array([6, 1, 5])
It was in just such a context that I recall first seeing this 32 array limit to choose, and one of the few where I've seen choose used in an answer.
It is a compiled function, PyArray_Choose and array_choose
https://github.com/numpy/numpy/blob/0b2e590ec18942f8f149ab2306b80da86b04eaeb/numpy/core/src/multiarray/item_selection.c
https://github.com/numpy/numpy/blob/945c308e96fb815729e8f8aeb0ad6b39b8bdf84a/numpy/core/src/multiarray/methods.c
I don't see any uses of this function in other compiled numpy code. And apart from testing, little use in rest of numpy.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With