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

Select 按列索引在Numpy数组的每行中选择一个元素,select,numpy,Select,Numpy,是否有更好的方法从“输入数组”和“选择id”中获取“输出数组” 我们可以去掉范围(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_

是否有更好的方法从“输入数组”和“选择id”中获取“输出数组”

我们可以去掉
范围(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]

您可以从给定的数组中进行选择,使用该数组从索引数组(在您的情况下为
select\u id
)和一组数组(在您的情况下为
input\u 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])
那么:

[input_array[x,y] for x,y in zip(range(len(input_array[:,0])),select_id)]
我认为这很方便

[input_array[enum, item] for enum, item in enumerate(select_id)]
(因为我不能将此作为对已接受答案的评论)

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

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

OP询问:

  • 是否有更好的方法从
    输入数组
    选择id
    获取
    输出数组
    • 我想说,你最初建议的方式似乎是这里介绍的方式中最好的。它易于理解,可扩展到大型阵列,而且效率很高
  • 我们可以去掉
    范围(input_array.shape[0])
    • 是的,正如其他答案所示,但被接受的答案通常不如OP已经建议的那样有效

  • 这是一种病态的做法,肯定不会比你现有的更好,但是
    np。对角线(input_array[:,select_id])
    也会让你
    数组([3,5,50])
    。除了使用
    arange
    而不是
    范围之外,问题中的高级索引解决方案已经是最好的选择。我必须对大量数据进行数学运算。所以我试着用numpy进行矢量化。通过在线循环节省时间总是很好的。我真的需要numpy来处理大量数据…我们如何修改它们,而不是输出这些值呢?你可以用它来评论这不适用于大型数组,正如Nathan在下面指出的。它给出了“ValueError:至少需要1个,最多需要32个数组对象”。有人知道这个方法被限制在小数组中的原因吗?这将是一个非常长的注释;)哈,当一个人写一些东西作为答案的时候,我想它只会变得更长。然后我觉得有义务通过直接回答老年退休金计划的问题来“回答”。