Eu tenho uma matriz:
U = np.array([3, 5, 7, 9, 11])
Quero obter um resultado como:
result = np.array([
[ np.nan, np.nan, np.nan, np.nan, np.nan],
[U[0] - U[1], np.nan, np.nan, np.nan, np.nan],
[U[0] - U[2], U[1] - U[2], np.nan, np.nan, np.nan],
[U[0] - U[3], U[1] - U[3], U[2] - U[3], np.nan, np.nan],
[U[0] - U[4], U[1] - U[4], U[2] - U[4], U[3] - U[4], np.nan]
])
Posso usar np.tril_indices(4, k=-1)
para obter índices do triângulo inferior sem diagonal, mas o que vem depois?
Uma abordagem ingênua que faz mais trabalho do que o necessário é calcular toda a diferença e selecionar os elementos necessários:
Esta é uma das ocasiões em que
np.where
é realmente útil usar uma máscara simples, embora também possa ser feito com uma máscara:Uma abordagem mais eficiente pode ser usar os índices mais diretamente para indexar na fonte:
Não é muito eficiente, mas possui apenas algumas linhas de código:
u
.nan
.Aqui estão os resultados de tempo usando a resposta aceita como base – a versão que usa
where
e a versão que usa mascaramento parecem ter uma vantagem para tamanhos menores; as diferenças parecem cada vez mais insignificantes para tamanhos maiores:Código usado para cronometragem (observe que troquei a ordem de subtração por
baseline_where()
ebaseline_mask()
para estar de acordo com a pergunta do OP, também corrigi um erro de digitação ((…)[mask]
em vez de[…][mask]
) embaseline_mask()
: