36

有没有更好的方法从“input_array”和“select_id”获取“output_array”?

我们能摆脱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

4 回答 4

35

您可以从给定数组中进行选择,使用numpy.choosewhich 从索引数组(在您的情况下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])
于 2013-06-13T07:38:31.213 回答
8

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

请注意,numpy.choose仅当您有 32 个或更少的选择时才有效(在这种情况下,您要索引的数组的维度必须为 32 或更小)。此外,文档numpy.choose

为了减少误解的机会,即使名义上支持以下“滥用”,但选择既不应该也不应该被认为是单个数组,即最外层的类似序列的容器应该是列表或元组。

OP问:

  1. 有没有更好的方法来output_array获取input_arrayand select_id
    • 我想说,你最初建议的方式似乎是这里介绍的最好的方式。它易于理解,可扩展到大型阵列并且高效。
  2. 我们能摆脱range(input_array.shape[0])吗?
    • 是的,正如其他答案所示,但接受的答案通常不如OP已经建议做的那样好。
于 2017-05-22T20:07:58.433 回答
2

我认为枚举很方便。

[input_array[enum, item] for enum, item in enumerate(select_id)]
于 2013-06-13T13:32:55.570 回答
0

怎么样:

[input_array[x,y] for x,y in zip(range(len(input_array[:,0])),select_id)]
于 2013-06-13T13:06:56.230 回答