Como posso usar uma matriz boolean 2-d para selecionar a partir de uma matriz 1-d em uma base per-linha no numpy?

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

  •  22-07-2019
  •  | 
  •  

Pergunta

Deixe-me ilustrar esta questão com um exemplo:

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 agora detém o resultado desejado, mas tenho certeza que há um método específico da numpy para fazer isso, que evita a iteração explícita. O que é isso?

Foi útil?

Solução

Se entendi sua pergunta corretamente, você pode simplesmente usar a multiplicação de matrizes:

result = numpy.dot(matrix, base)

Se o resultado deve ter a mesma forma como no seu exemplo basta adicionar um remodelar:

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

Se a matriz não é simétrica ter cuidado com a ordem em ponto.

Outras dicas

Aqui é uma outra maneira feia de fazê-lo:

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

A minha tentativa:

numpy.sum(matrix * base, axis=1)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top