применить linspace к xarray - PullRequest
       17

применить linspace к xarray

0 голосов
/ 30 января 2020

У меня есть 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. Есть ли хорошее решение этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...