這是我如何獲得我的ND數據(func
是IRL不是矢量化):取結果的一維列表,並將其轉換爲ND xarray.DataArray
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)])
這是一個簡單的例子,但通常我〜10D的數據,我通過映射itertools.product
(並行)獲得工作。
我的問題:我怎麼能做到這一點沒有重塑我的數據,並通過使用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)
注意你編輯過的問題,不好。低於原始問題的答案。 – Balzola
我的問題的本質並沒有改變。我只是添加了一個維度,使它看起來不那麼瑣碎。請注意,我說:「我使用〜10D數據」。 – johnbaltis
它確實改變了問題的本質!另外你被z分割的事實肯定會改變這個問題。自己決定是否需要任何幫助。 – Balzola