Проверьте, не равна ли переменная ни одному из элементов вектора - PullRequest
2 голосов
/ 21 марта 2019

У меня есть вектор dogSpecies, показывающий все четыре исследуемых уникальных вида собак.

#a set of possible dog species
dogSpecies = [1,2,3,4]

У меня также есть вектор data, содержащий целые числа, соответствующие записям видов собак всех протестированных собак.

# species of examined dogs
data = np.array(1,1,2,-1,0,2,3,5,4)

Некоторые записи в data содержат значения, отличные от 1,2,3 или 4. (Например, -1, 0 или 5). Если элемент в наборе data не равен ни одному из элементов dogSpecies, такое вхождение должно быть помечено в булевой матрице оценки ошибок как False.

#initially all the elements of the boolean error evaluation vector are True.

errorEval = np.ones((np.size(data,axis = 0)),dtype=bool)

В идеале мой errorEval вектор должен выглядеть так:

errorEval = np.array[True, True, True, False, False, True, True, False, True]

Мне нужен фрагмент кода, который проверяет, не равны ли элементы data элементам вектора dogSpecies. Мой код по какой-то причине помечает каждый элемент вектора errorEval как «Ложь».

for i in range(np.size(data, axis = 0)):
# validation of the species
            if (data[i] !=  dogSpecies):
                    errorEval[i] = False

Я понимаю, что не могу сравнить один элемент с вектором из четырех элементов, как указано выше, но как мне тогда это сделать?

Ответы [ 3 ]

1 голос
/ 21 марта 2019

Разве это не то, что вы хотите?

for index, elem in enumerate(data):
    if elem not in dogSpecies:
        errorEval[index] = False

Вероятно, не очень быстро, он не использует векторизованный numpy ufuncs, но если массив не очень большой, это не будет иметь значения. Преобразование dogSpecies в set также ускорит процесс.


Кроме того, ваш питон выглядит очень в стиле c / java. Я бы посоветовал прочитать руководство по стилю python .

0 голосов
/ 21 марта 2019

Как сказал @FHTMitchel, вы должны использовать in, чтобы проверить, есть ли элемент в списке или нет.
Но вы можете использовать понимание списка, которое быстрее обычного цикла и короче:

errorEval = np.array([True if elem in dogSpecies else False for elem in data])
0 голосов
/ 21 марта 2019

Если я правильно понимаю, у вас есть дата-фрейм и список видов собак. Это должно достичь того, что вы хотите.

df = pd.DataFrame({'dog': [1,3,4,5,1,1,8,9,0]})

   dog
0    1
1    3
2    4
3    5
4    1
5    1
6    8
7    9
8    0


df['errorEval'] = df['dog'].isin(dogSpecies).astype(int)

   dog  errorEval
0    1          1
1    3          1
2    4          1
3    5          0
4    1          1
5    1          1
6    8          0
7    9          0
8    0          0

df.errorEval.values
# array([1, 1, 1, 0, 1, 1, 0, 0, 0])

Если вы не хотите создавать новый столбец, вы можете сделать:

df.assign(errorEval=df['dog'].isin(dogSpecies).astype(int)).errorEval.values
# array([1, 1, 1, 0, 1, 1, 0, 0, 0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...