如何在numpy中使用2-d布尔数组从每行的1-d数组中进行选择?

时间:2009-01-14 07:49:25

标签: python numpy

让我用一个例子说明这个问题:

import numpy

matrix = numpy.identity(5, dtype=bool) #Using identity as a convenient way to create an array with the invariant that there will only be one True value per row, the solution should apply to any array with this invariant
base = numpy.arange(5,30,5) #This could be any 1-d array, provided its length is the same as the length of axis=1 of matrix from above

result = numpy.array([ base[line] for line in matrix ])

result现在保持了期望的结果,但我确信有一个特定于numpy的方法可以避免显式迭代。它是什么?

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题你可以简单地使用矩阵乘法:

result = numpy.dot(matrix, base)

如果结果必须与示例中的形状相同,则只需添加一个整形:

result = numpy.dot(matrix, base).reshape((5,1))

如果矩阵不对称,请注意点的顺序。

答案 1 :(得分:0)

这是另一种丑陋的方式:

n.apply_along_axis(base.__getitem__, 0, matrix).reshape((5,1))

答案 2 :(得分:0)

我的尝试:

numpy.sum(matrix * base, axis=1)