Как мне использовать 2-й логический массив для выбора из 1-го массива для каждой строки в numpy?

StackOverflow https://stackoverflow.com/questions/442218

  •  22-07-2019
  •  | 
  •  

Вопрос

Позвольте мне проиллюстрировать этот вопрос на примере:

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 метод, позволяющий избежать явной итерации. Что это?

Это было полезно?

Решение

Если я правильно понимаю ваш вопрос, вы можете просто использовать матричное умножение:

result = numpy.dot(matrix, base)

Если результат должен иметь ту же форму, что и в вашем примере, просто добавьте изменение формы:

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

Если матрица не симметрична, следите за порядком в точке.

Другие советы

Вот еще один уродливый способ сделать это:

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

Моя попытка:

numpy.sum(matrix * base, axis=1)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top