这就是我获取 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)])
这是一个简单的示例,但通常我使用通过映射 a 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)
编辑 2 看到这个问题:https ://github.com/pydata/xarray/issues/1914