Оператор np.logical_and не работает должным образом (numpy) - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть набор данных (ndarray, float 32), например:

[-3.4028235e+38 -3.4028235e+38 -3.4028235e+38 ...  1.2578617e-01
  1.2651859e-01  1.3053264e-01] ...

Я хочу удалить все значения ниже 0, больше 1, поэтому я использую:

 with rasterio.open(raster_file) as src:
            h = src.read(1)
            i = h[0]
            i[np.logical_and(i >= 0.0, i <= 1.0)]

Очевидно, что первые записи (т.е. -3.4028235e + 38) должны быть удалены, но они все еще появляются после применения оператора. Мне интересно, связано ли это с научной нотацией, и требуется ли выполнить предварительный шаг, но я не вижу, что именно. А идеи?

Чтобы упростить это, вот код снова:

    pp = [-3.4028235e+38, -3.4028235e+38, -3.4028235e+38, 1.2578617e-01, 1.2651859e-01,  1.3053264e-01]
    pp[np.logical_and(pp => 0.0, pp <= 1.0)]
    print (pp)

И результат

pp = [-3.4028235e+38, -3.4028235e+38, -3.4028235e+38, 0.12578617, 0.12651859, 0.13053264]

Таким образом, первые 3 записи все еще остаются.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Проблема в том, что вы не удаляете выбранные вами индексы. Вы просто выбираете их.

Если вы хотите удалить их. Вам, вероятно, следует преобразовать их в nans как таковые

from numpy import random, nan, logical_and

a = random.randn(10, 3)
print(a)
a[logical_and(a > 0, a < 1)] = nan
print(a)

Пример вывода

[[-0.95355719         nan         nan]
 [-0.21268393         nan -0.24113676]
 [-0.58929128         nan         nan]
 [        nan -0.89110972         nan]
 [-0.27453321  1.07802157  1.60466863]
 [-0.34829213         nan  1.51556019]
 [-0.4890989          nan -1.08481203]
 [-2.17016962         nan -0.65332871]
 [        nan  1.58937678  1.79992471]
 [        nan -0.91716538  1.60264461]]

В качестве альтернативы вы можете посмотреть в масках

0 голосов
/ 10 ноября 2018

Глупая ошибка, мне пришлось обернуть массив в пустой массив, а затем назначить переменную для нового созданного массива, например:

    j = np.array(pp)
    mask = j[np.logical_and(j >= 0.0, j <= 1.0)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...