Мне нужна помощь в преобразовании выражения Matlab find () в Python - PullRequest
1 голос
/ 05 марта 2020

В Matlab вычисляется следующий индекс:

index = find(the(:) == lat & phi(:) == lon & ~isnan(dat(:)));

Все массивы имеют одинаковый размер. Я пытаюсь преобразовать этот индекс для использования в python и добавить еще один аргумент. Вот что у меня есть:

index = np.argwhere((the[:] == lat) & (phi[:] == lon) & (~np.isnan(dat[:])) & (start <= tim[:] <= stop))

Идея состоит в том, чтобы использовать этот индекс, чтобы найти все значения в массивах, которые удовлетворяют условиям в индексе. Когда я пытаюсь использовать созданную мной версию Python, она возвращает ошибку:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Я не заставил a.all () или a.any () работать. Мне нужно использовать это? и если да, то как мне правильно их использовать в этом случае?

1 Ответ

1 голос
/ 06 марта 2020

Вы можете подписаться на NumPy для пользователей Matlab страница.

  • NumPy the[:] не эквивалентно MATLAB the(:), вы можете использовать the.flatten()
  • & в NumPy, применять побитовое И, использовать logical_and вместо.
  • Вместо argwhere используйте nonzero.

Вы не опубликовали ни одного образца входных данных, поэтому изобрели некоторые входные данные (для тестирования).

Вот код Python:

from numpy import array, logical_and, logical_not, nonzero, isnan, r_

# MATLAB code:
#the = [1:3; 4:6];
#lat = 3;
#phi = [5:7; 6:8];
#dat = [2, 3; 5, 4; 4, 6];
#lon = 7;
#index = find(the(:) == lat & phi(:) == lon & ~isnan(dat(:)));

# https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html
the = array([r_[1:4], r_[4:7]])
lat = 3
phi = array([r_[5:8], r_[6:9]])
dat = array([[2, 3], [5, 4], [4, 6]])
lon = 7

index = nonzero(logical_and(logical_and(the.flatten() == lat, phi.flatten() == lon), logical_not(isnan(dat.flatten()))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...