Select 按列索引在Numpy数组的每行中选择一个元素
是否有更好的方法从“输入数组”和“选择id”中获取“输出数组” 我们可以去掉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_
范围(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或更小)。此外,fornumpy.选择
会显示
为了减少误解的机会,即使名义上支持以下“滥用”,选择也不应该是,也不应该被认为是单个数组,也就是说,最外层的类似序列的容器应该是列表或元组
OP询问:
输入数组
和选择id
获取输出数组
?
- 我想说,你最初建议的方式似乎是这里介绍的方式中最好的。它易于理解,可扩展到大型阵列,而且效率很高
范围(input_array.shape[0])
?
- 是的,正如其他答案所示,但被接受的答案通常不如OP已经建议的那样有效
这是一种病态的做法,肯定不会比你现有的更好,但是
np。对角线(input_array[:,select_id])
也会让你数组([3,5,50])
。除了使用arange
而不是范围之外,问题中的高级索引解决方案已经是最好的选择。我必须对大量数据进行数学运算。所以我试着用numpy进行矢量化。通过在线循环节省时间总是很好的。我真的需要numpy来处理大量数据…我们如何修改它们,而不是输出这些值呢?你可以用它来评论这不适用于大型数组,正如Nathan在下面指出的。它给出了“ValueError:至少需要1个,最多需要32个数组对象”。有人知道这个方法被限制在小数组中的原因吗?这将是一个非常长的注释;)哈,当一个人写一些东西作为答案的时候,我想它只会变得更长。然后我觉得有义务通过直接回答老年退休金计划的问题来“回答”。