按列索引在Numpy数组的每一行中选择一个元素

时间:2013-06-12 20:10:26

标签: select numpy

有没有更好的方法来获得" output_array"来自" input_array"和" select_id" ?

我们可以摆脱range( input_array.shape[0] )吗?

>>> input_array = numpy.array( [ [3,14], [12, 5], [75, 50] ] )
>>> select_id = [0, 1, 1]
>>> print input_array
[[ 3 14]
 [12  5]
 [75 50]]

>>> output_array = input_array[  range( input_array.shape[0] ), select_id ]
>>> print output_array
[ 3  5 50]

4 个答案:

答案 0 :(得分:29)

您可以使用numpy.choose从给定数组中选择,该数组从索引数组(在您的情况下为select_id)和一组数组(在您的情况下为input_array)中构造数组来选择从。但是,您可能需要转置input_array以匹配尺寸。以下是一个小例子:

In [101]: input_array
Out[101]: 
array([[ 3, 14],
       [12,  5],
       [75, 50]])

In [102]: input_array.shape
Out[102]: (3, 2)

In [103]: select_id
Out[103]: [0, 1, 1]

In [104]: output_array = np.choose(select_id, input_array.T)

In [105]: output_array
Out[105]: array([ 3,  5, 50])

答案 1 :(得分:7)

(因为我不能将此作为对已接受答案的评论发布)

请注意, numpy.choose仅在您有32个或更少选择时才有效(在这种情况下,您要对其进行索引的数组的维度必须为32或者小)。此外,numpy.choose的{​​{3}}表示

  

为了减少误解的可能性,即使以下"滥用"在名义上支持,选择既不应该也不应该被认为是单个数组,即最外层的序列式容器应该是列表或元组。

OP问道:

  1. 是否有更好的方式从output_arrayinput_array获取select_id
    • 我想说,你最初建议的方式似乎是这里提出的最好的方式。它易于理解,可扩展到大型数组,并且效率很高。
  2. 我们可以摆脱range(input_array.shape[0])吗?
    • 是的,正如其他答案所示,但被接受者并不像OP已经建议做的那么好。

答案 2 :(得分:2)

我认为enumerate很方便。

[input_array[enum, item] for enum, item in enumerate(select_id)]

答案 3 :(得分:0)

怎么样:

[input_array[x,y] for x,y in zip(range(len(input_array[:,0])),select_id)]