これは、ND データを取得する方法です ( func
IRL はベクトル化できません)。
import numpy
import xarray
import itertools
xs = numpy.linspace(0, 10, 100)
ys = numpy.linspace(0, 0.1, 20)
zs = numpy.linspace(0, 5, 200)
def func(x, y, z):
return x * y / z
vals = list(itertools.product(xs, ys, zs))
result = [func(x, y, z) for x, y, z in vals]
自分のしていることは単純化できると感じています。データを再形成せずにこれを入れたいと思いxarray.DataArray
ます。しかし、これは私が今それを行う方法です:
arr = np.array(result).reshape(len(xs), len(ys), len(zs))
da = xarray.DataArray(arr, coords=[('x', xs), ('y', ys), ('z', zs)])
itertools.product
これは単純な例ですが、通常、 (並列に)をマッピングして取得した ~10D データを使用します。
私の質問: データを再形成せずに、 、、およびvals
の長さを使用および使用せずにこれを行うにはどうすればよいですか?xs
ys
zs
あなたが何をするかと同様の方法で:
index = pandas.MultiIndex.from_tuples(vals, names=['x', 'y', 'z'])
df = pandas.DataFrame(result, columns=['result'], index=index)
編集: @hpauljの答えに触発されて、これが私がそれを解決した方法です、ありがとう!
import numpy
import xarray
import itertools
coords = dict(x=numpy.linspace(0, 10, 100),
y=numpy.linspace(0, 0.1, 20),
z=numpy.linspace(0, 5, 200))
def func(x, y, z):
return x * y / z
result = [func(x, y, z) for x, y, z in itertools.product(*coords.values())]
xarray.DataArray(numpy.reshape(result, [len(i) for i in coords.values()]), coords=coords)
EDIT 2 この問題を参照してください: https://github.com/pydata/xarray/issues/1914