У меня есть 2D xarray.DataArray с «time» и «x» в качестве измерений:
data = np.random.random((3,4))
time = np.arange(50, 53)
x = np.arange(4)
arr = xr.DataArray(data, coords={'time': time, 'x': x},
dims=['time', 'x'])
arr
output:
<xarray.DataArray (time: 3, x: 4)>
array([[0.960759, 0.340444, 0.573149, 0.690039],
[0.79212 , 0.775443, 0.120888, 0.248453],
[0.899548, 0.946067, 0.014398, 0.403006]])
Coordinates:
* time (time) int32 50 51 52
* x (x) int32 0 1 2 3
Для каждого раза мне нужно генерировать linspace, начиная с минимального значения вдоль «x» до максимальное значение по x, с номером шага N=5
в качестве параметра. Результат будет в форме («время», «N»). Поскольку мне нужен DataArray в качестве вывода, я использовал xr.apply_ufun c. Я ожидал, что будет работать следующее:
result = xr.apply_ufunc(np.linspace,
arr.min('x'), arr.max('x'), 5)
, но в итоге оно будет выглядеть так:
File "C:\Users\Yu-Kun Qian\AppData\Roaming\Python\Python37\site-packages\numpy\core\function_base.py", line 124, in linspace
if step == 0:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
После некоторого поиска в Google я обнаружил, что np.linspace не векторизовано (старая версия numpy) 1.15.4, см. здесь ). Поэтому я создал свою собственную функцию linspace следующим образом:
def mylinspace(start, stop, N, endpoint=True):
if endpoint==1:
divisor = N-1
else:
divisor = N
steps = (1.0/divisor) * (stop - start)
return steps[:,None] * np.arange(N) + start[:,None]
result = xr.apply_ufunc(mylinspace,
arr.min('x'), arr.max('x'), 5)
Она все равно заканчивается ошибкой:
File "C:\Users\Yu-Kun Qian\Anaconda3\lib\site-packages\xarray\core\computation.py", line 623, in apply_variable_ufunc
data.ndim, len(dims), dims
ValueError: applied function returned data with unexpected number of dimensions: 2 vs 1, for dimensions ('time',)
Я немного смущен apply_ufun c. Есть ли хорошее решение этой проблемы?