Eu tenho o seguinte DataArray
arr = xr.DataArray([[0.33, 0.25],[0.55, 0.60],[0.85, 0.71],[0.92,0.85],[1.50,0.96],[2.5,1.1]],[('x',[0.25,0.5,0.75,1.0,1.25,1.5]),('y',[1,2])])
Isso fornece a seguinte saída
<xarray.DataArray (x: 6, y: 2)>
array([[0.33, 0.25],
[0.55, 0.6 ],
[0.85, 0.71],
[0.92, 0.85],
[1.5 , 0.96],
[2.5 , 1.1 ]])
Coordinates:
* x (x) float64 0.25 0.5 0.75 1.0 1.25 1.5
* y (y) int32 1 2
ou classificados abaixo com xe saída (z) um ao lado do outro por conveniência.
x z (y=1) z(y=2)
0.25 0.33 0.25
0.50 0.55 0.60
0.75 0.85 0.71
1.00 0.92 0.85
1.25 1.50 0.96
1.50 2.50 1.10
Os dados que tenho são o resultado de vários valores de entrada. Um deles é o valor x. Existem várias outras dimensões (como y) para outros valores de entrada. Quero saber quando meu valor de saída (z) está crescendo acima de 1,00, mantendo as outras dimensões fixas e variando o valor x. No exemplo bidimensional acima, eu gostaria de obter a resposta [1.03 1.32]. Como um valor de 1,03 para x me dará 1,00 para z quando y = 1 e um valor de 1,32 para x me dará 1,00 para z quando y = 2.
edit: Como a saída z aumentará com o aumento de x, existe apenas um ponto em que z terá 1,0 como saída.
Existe alguma maneira eficiente de conseguir isso com o xarray? Minha tabela atual é muito maior e possui 4 entradas (dimensões).
Obrigado por qualquer ajuda!
fonte
O problema que tive com a resposta do jojo é que é difícil expandi-lo em várias dimensões e manter a estrutura de raio-x. Por isso, decidi aprofundar isso. Eu usei algumas idéias do código de jojo para fazer a resposta abaixo.
Eu faço duas matrizes, uma com a condição de que os valores sejam menores do que o que procuro e outra com a condição de que eles precisam ser maiores. Mudo o segundo na direção x em menos 1. Agora os combino em uma fórmula de interpolação linear normal. As duas matrizes têm apenas valores sobrepostos na 'borda' da condição. Se não for deslocado por -1, nenhum valor será sobreposto. Na linha final,
NaN
somarei a direção x e, como todos os outros valores são , extraio o valor correto e removo a direção x do DataArray no processo.Eu tenho algumas desvantagens no meu código. O código funciona apenas se M0 e M1 encontrarem um valor que atenda à condição. Caso contrário, todos os valores nessa linha serão definidos como
NaN
. Para evitar problemas com M0, decidi que os valores-x iniciassem em 0, pois meu valor-alvo é sempre maior que 0. Para evitar problemas com M1, escolho meus valores de x grandes o suficiente para saber que meus valores estão lá. . Naturalmente, essas não são soluções ideais e podem quebrar o código. Se eu tiver um pouco mais de experiência com xarray e python, posso reescrever. Em resumo, tenho os seguintes itens que gostaria de resolver:fonte