【问题标题】:Select One Element in Each Row of a Numpy Array by Column Indices [duplicate]按列索引在 Numpy 数组的每一行中选择一个元素
【发布时间】:2013-06-09 02:12:40
【问题描述】:

有没有更好的方法从“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]

【问题讨论】:

  • 这是一种病态的做法,绝对不会比你拥有的更好,但np.diagonal(input_array[:, select_id]) 也会让你得到array([ 3, 5, 50])
  • 除了使用arange而不是range之外,问题中的高级索引解决方案已经是最好的选择了。

标签: select numpy


【解决方案1】:

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

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

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

OP 询问:

  1. 有没有更好的方法从input_arrayselect_id 中获取output_array
    • 我想说,您最初建议的方式似乎是此处介绍的最佳方式。它易于理解,可扩展到大型阵列,而且效率很高。
  2. 我们可以摆脱range(input_array.shape[0]) 吗?
    • 是的,如其他答案所示,但接受的答案通常不如 OP 已经建议做的那样好。

【讨论】:

  • 那将是一个非常长的评论;)
  • 哈,当一个人写一些东西作为答案时,我认为它会变得更长。然后我觉得有义务通过直接解决 OP 的问题来使其成为“答案”。
【解决方案2】:

我认为enumerate 很方便。

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

【讨论】:

  • 通过内联循环节省时间总是不错的。我真的需要 numpy 来处理大量数据......
【解决方案3】:

怎么样:

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

【讨论】:

  • 我必须对大量数据进行数学运算。所以我尝试用 numpy 向量化。
【解决方案4】:

您可以使用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])

【讨论】:

  • 不输出这些值,我们如何就地修改它们?
  • 必须评论这不适用于大型数组,正如 Nathan 在下面指出的那样。它给出“ValueError:需要至少 1 个和最多 32 个数组对象”。有人知道这种方法仅限于小数组的原因吗?
猜你喜欢
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 2019-04-01
  • 2018-12-05
  • 2012-01-05
  • 2016-09-24
相关资源
最近更新 更多