numpy.take和numpy.choose有什么区别?

rd1*_*d11 16 python arrays numpy

它似乎numpy.take(array, indices)numpy.choose(indices, array)返回相同的东西:array索引的子集indices.

两者之间是否只有微妙的差异,或者我错过了一些更重要的东西?是否有理由偏爱另一个?

rd1*_*d11 24

numpy.take(array, indices)并且numpy.choose(indices, array)在1-D阵列上表现相似,但这只是巧合.正如jonrsharpe所指出的,它们在高维数组上表现不同.

numpy.take

numpy.take(array, indices)挑选出扁平版本的元素array.(结果元素当然不一定来自同一行.)

例如,

numpy.take([[1, 2], [3, 4]], [0, 3])
Run Code Online (Sandbox Code Playgroud)

回报

array([1, 4])
Run Code Online (Sandbox Code Playgroud)

numpy.choose

numpy.choose(indices, set_of_arrays)从数组中取出元素0,从数组中取出元素indices[0]1,从数组中取出元素indices[1]2 indices[2],依此类推.(这里,array实际上是一组数组.)

例如

numpy.choose([0, 1, 0, 0], [[1, 2, 3, 4], [4, 5, 6, 7]])
Run Code Online (Sandbox Code Playgroud)

回报

array([1, 5, 3, 4])
Run Code Online (Sandbox Code Playgroud)

因为元素0来自数组0,元素1来自数组1,元素2来自数组0,元素3来自数组0.

更多信息

这些描述是简化的 - 完整描述可以在这里找到:numpy.take,numpy.choose.例如,numpy.takenumpy.choose行为类似时indicesarray是1- d因为numpy.choose第一广播array.


jon*_*rpe 9

它们肯定不是等价的,正如你可以看到通过给两个方法提供相同的参数(切换):

>>> a = np.array([[1, 2, 3, 4], 
                  [5, 6, 7, 8], 
                  [9, 10, 11, 12], 
                  [13, 14, 15, 16]])
>>> np.choose([0, 2, 1, 3], a)
array([ 1, 10,  7, 16]) # one from each row
>>> np.take(a, [0, 2, 1, 3])
array([1, 3, 2, 4]) # all from same row
Run Code Online (Sandbox Code Playgroud)

我建议你阅读的文档takechoose.