Проблема при фильтрации строк массива numpy по нескольким условиям - PullRequest
0 голосов
/ 13 июня 2018

Я хочу отфильтровать массив по нескольким условиям.Я нашел эту ветку и протестировал метод нарезки на моем наборе данных, но получил неожиданные результаты.Ну, по крайней мере для меня они неожиданны, так как у меня может возникнуть проблема с пониманием функциональности побитовых операторов или что-то еще: /

Просто чтобы вы поняли данные:

test.shape
>>(222988, 2)

stats.describe(all_output[:, 0])
>>DescribeResult(nobs=222988, minmax=(2.594e-05, 74.821), mean=11.106, variance=108.246, [...])

stats.describe(all_output[:, 1])
>>DescribeResult(nobs=222988, minmax=(0.001, 8.999), mean=3.484, variance=7.606, [...])

Теперь, выполняя некоторую базовую фильтрацию:

test1 = test[(test[:, 0] >= 30) & (test[:, 1] <= 2)] 

test1.shape
>>(337, 2)

Это на самом деле строки, которые я не хочу иметь в своем наборе данных, так что если я делаю то, что считаюобратное ...

test2 = test[(test[:, 0] <= 30) & (test[:, 1] >= 2)] 

test2.shape
>>(112349, 2)

Я ожидаю, что результат будет (222651, 2).Я предполагаю, что я делаю что-то смущающе простое неправильно?Может ли кто-нибудь здесь подтолкнуть меня в правильном направлении?

Спасибо уже!-М

1 Ответ

0 голосов
/ 13 июня 2018

Закон де Моргана : not (p and q) == (not p) *or* (not q).В любом случае, оператор not в numpy равен ~, поэтому

 ~((test[:, 0] >= 30) & (test[:, 1] <= 2)) == ((test[:, 0] < 30) | (test[:, 1] > 2))

Любой из них будет делать то, что вы хотите, например,

test1 = test[~((test[:, 0] >= 30) & (test[:, 1] <= 2))]
...