Найти элементы в массиве так, чтобы inf <element <sup в Python - PullRequest
0 голосов
/ 01 июня 2018

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

import numpy as np

def v1(array,inf,sup):
    for i in range(len(array)):
        if inf<array[i]<sup:
            array[i]-=10
    return array

Мне предложили использовать np.where.Это работает гладко, если есть только одно логическое условие:

def v2(array,sup):
    array[np.where(array < sup)[0]]-=10
    return array

Но та же самая установка со значениями inf и sup, т.е.

array[np.where(inf < array < sup)[0]]-=10

вызовет ошибку

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

Мне нужно сделать что-то неуклюжее, например, дважды использовать np.where с двумя условиями и пересекать два полученных массива индексов ...

def v2(array,inf,sup):
    i=list(set.intersection(set(np.where(array>inf)[0]),set(np.where(array<sup)[0])))
    array[i]-=10
    return array

Предложения?

Ответы [ 2 ]

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

В качестве альтернативы вы также можете использовать списочное понимание в качестве индекса и использовать цепочку сравнения для каждого элемента в понимании.

>>> A = np.array([i*10 for i in range(10)])
>>> inf, sup = 30, 70
>>> A[[inf < x < sup for x in A]] *= 10
>>> A
array([  0,  10,  20,  30, 400, 500, 600,  70,  80,  90])

В данном примере использование &, как в другом ответе, работаетточно так же, если не лучше, но это может быть более универсально применимо, например, для проверки некоторой функции для каждого значения.

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

Используйте &, чтобы иметь несколько условий с np.where:

array[np.where((inf < array) & (array < sup))[0]] -= 10

или без np.where:

array[(inf < array) & (array < sup)] -= 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...