numpy.gradient, возвращающий значения nan при использовании массива varargs с постоянными значениями - PullRequest
1 голос
/ 03 мая 2019

У меня есть массив временных шагов (в секундах) и массив местоположений (в широте). Оба массива имеют одинаковый размер с N = 36. Я вычисляю градиент np. между двумя массивами, который возвращает значения nan, когда любые два последовательных временных шага имеют одинаковое значение. Но когда я вычисляю градиент, используя постоянный скаляр в качестве значения vararg, я получаю правильный вывод данных. Мне нужно найти способ создать правильный выход градиента с различными временными шагами.

Использование Python 3.4 и Numpy 1.14

Я попытался вычислить градиент с моим исходным массивом временного шага, который возвращал значения nan, когда значения совпадают. Затем я попытался вычислить градиент с одним скалярным значением в качестве входа vararg, который дал мне правильный вывод. Затем я попытался установить vararg в виде пустого массива с одинаковыми значениями временного шага, который возвращал все значения -inf.

#Original Code:    
dt = np.array([10800,10800,9900,5400,6300]) #delta time in seconds
x = np.array([-85.18,-85.80,-86.3,-87,-87.0]) #delta x in decimal degrees
dx_dt = np.gradient(x,dt) 
#returns:
#[nan,nan, 4.8e-004,-3.1e-004,-2.19e-004]

#Test 1 - test with constant scalar
dx_dt = np.gradient(x,10800) 
#returns:
#[-5.5e-5,-5.1e-5,-5.5e-5,-4.1e-5,-5.1e-5]

#Test 2 - test with constant array
dt = np.array([10800,10800,10800,10800,10800)]
dx_dt = np.gradient(x,dt) 
#returns:
#[-inf,-inf,-inf,-inf,-inf]

Я ожидаю, что выход np.gradient (x, 10800) будет таким же, как np.gradient (x, np.array ([10800,10800,10800,10800,10800]))), но это не является.

Мне нужен вывод без значений nan или inf для работы следующей части кода, просто установка -inf или nans в 0 не поможет.

1 Ответ

1 голос
/ 03 мая 2019

Для numpy.gradient, когда varargs является массивом, должны быть заданы координаты значений вдоль t, а не дельты.См. Пункт 3 np.gradient документации ниже.

varargs: список скаляров или массив, необязательно

Интервал между значениями f.Унитарное расстояние по умолчанию для всех размеров.Интервал можно указать, используя:

  1. один скаляр, чтобы указать расстояние выборки для всех измерений.
  2. N скаляров, чтобы указать постоянное расстояние выборки для каждого измерения.т. е. dx, dy, dz,…

  3. N массивов для указания координат значений по каждому измерению F. Длина массива должна соответствовать размеру соответствующегоразмерность.

  4. Любая комбинация из N скаляров / массивов со значениями 2. и 3.

Чтобы получить свой градиент, вы можете использоватьnp.cumsum, чтобы получить координаты из дельт:

dt = np.array([10800,10800,9900,5400,6300]) #delta time in seconds
t = np.cumsum(dt)
x = np.array([-85.18,-85.80,-86.3,-87,-87.0]) #delta x in decimal degrees
dx_dt = np.gradient(x,t) 

Что дает:

[-5.74074074e-05 -5.38061777e-05 -1.01703308e-04 -6.98005698e-05 0.00000000e+00]

И вы можете проверить, что:

dx_dt = np.gradient(x,10800) 

и

dt = np.array([10800,10800,10800,10800,10800])
t = np.cumsum(dt)
dx_dt = np.gradient(x,t) 

дают одинаковый результат:

[-5.74074074e-05 -5.18518519e-05 -5.55555556e-05 -3.24074074e-05 0.00000000e+00]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...