使用我的代码我遇到了numpy.choose
方法不接受所有参数的问题,因为它受NPY_MAXARGS
(=32
)的限制。是否有可用的替代方法,允许任意数量的参数数组或至少超过32
的{{1}}?
numpy.choose
任何帮助将不胜感激......:)
答案 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_Choose
和array_choose
我在其他已编译的numpy代码中看不到此函数的任何用法。除了测试之外,在numpy
的其余部分中几乎没有用。