numpy.choose的替代方案,允许任意或至少超过32个参数?

时间:2016-08-26 08:53:24

标签: python numpy

使用我的代码我遇到了numpy.choose方法不接受所有参数的问题,因为它受NPY_MAXARGS=32)的限制。是否有可用的替代方法,允许任意数量的参数数组或至少超过32的{​​{1}}?

numpy.choose

任何帮助将不胜感激......:)

2 个答案:

答案 0 :(得分:5)

指数可以作为列表给出。假设selections的长度与choices相同:

b = numpy.array(choices)
result = b[range(len(selections)), selections]

将在选择中给出索引指定的选项中的值。看到它在行动:

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])

答案 1 :(得分:2)

choose具有32个对象限制,因为它将数组一起广播。请考虑这两个操作的错误消息:

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.

利用广播,从2d数组,1d和标量中挑选值的示例。

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. ]])

由于@Benjamin显示np.choose可用于从二维数组的连续列中选择项目 - 前提是不超过32列

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])

正是在这样的背景下,我才回想起第一次看到choose的32个阵列限制,以及我在答案中使用过的少数几个choose之一。

这是一个已编译的函数,PyArray_Choosearray_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

我在其他已编译的numpy代码中看不到此函数的任何用法。除了测试之外,在numpy的其余部分中几乎没有用。