2016-10-21 71 views
3

簡単な質問:私はxarray DataArrayの最大値だけでなく、その座標も求めています。どうやってするか?xarrayの最大座標を取得する方法は?

私はもちろん自分で簡単に減らすことができますが、xarrayに何か組み込みがあるのだろうか?

答えて

7

あなたは最大値に基づいてフィルタリングするda.where()を使用することができます。

In [15]: da = xr.DataArray(np.random.rand(2,3,4)) 

In [16]: da.where(da==da.max(), drop=True) 
Out[16]: 
<xarray.DataArray (dim_0: 1, dim_1: 1, dim_2: 1)> 
array([[[ 0.91077406]]]) 
Coordinates: 
    * dim_0 (dim_0) int64 0 
    * dim_1 (dim_1) int64 2 
    * dim_2 (dim_2) int64 3 
+0

非常に素晴らしいです。 '.squeeze()'を追加してスカラ次元を絞り出すことができました。 – shoyer

1

idxmax()の方法は、xarrayではvery welcomeとなりますが、まだそれを実装することはまだありません。

今のところ、あなたは1D DataArrayを持っている場合、あなたはargmaxiselを組み合わせることで、最大の座標を見つけることができます:

>>> array = xarray.DataArray([1, 2, 3, 2, 1], [('x', ['a', 'b', 'c', 'd', 'e'])]) 
>>> array.isel(x=array.argmax().item()) 
<xarray.DataArray()> 
array(3) 
Coordinates: 
    x  |S1 'c' 

これは.max()は、すべての場合には何をすべきか、おそらくです!残念ながら、私たちはまだそこにはありません。

私たちが望むやり方では、まだ複数の次元にわたって最大限まで一般化していません。 2D入力を考えてみましょう:

>>> array2 = xarray.DataArray([[1, 2, 3], [3, 2, 1]], dims=['x', 'y']) 
>>> array2.argmax('y') # looks good 
<xarray.DataArray (x: 2)> 
array([2, 0]) 
Coordinates: 
    * x  (x) int64 0 1 
>>> array2.argmax() # what?? 
<xarray.DataArray()> 
array(2) 

問題は、それが自動的にnp.argmaxのように、平坦化だということです。代わりに、タプルの配列や配列のタプルのようなものがほしいかもしれません。これは、最大の元の整数座標を示しています。この寄付も歓迎されます - an issue an GitHubを開いて議論してください。

また、元の配列上のポイントを得るために、我々は今.isel_pointsにARGMAXを接続する必要があります。

>>> array2.isel_points(x=range(2), y=array.argmax('y')) 
<xarray.DataArray (points: 2)> 
array([3, 3]) 
Coordinates: 
    x  (points) int64 0 1 
    y  (points) int64 2 0 
    * points (points) int64 0 1 

(。我々はfix indexing to do proper broadcastingたら最終的に、あなたはまだこのため.iselを使用することができます)

関連する問題