работать только с отфильтрованными элементами в массиве в python - PullRequest
1 голос
/ 20 апреля 2020

Рассмотрим эту простую проблему: в списке целых чисел мне нужно умножить все четные числа на 10. Я, безусловно, могу выполнить поэлементную операцию, такую ​​как:

[if x%2==0: x=x*10 for x in arr]

Но что, если операция должна работать на уровне массива? Проблема, с которой я сталкиваюсь, заключается в том, как после операции с отфильтрованным массивом как правильно вернуть их в исходный массив?

Пример кода:

arr=np.arange(1,10) # the original array array([1, 2, 3, 4, 5, 6, 7, 8, 9])
filter1 = arr%2==0  # the filter 
arr1=arr[filter1]   # the filtered array array([2, 4, 6, 8])
arr1=arr1*10        # the 'array'-wise operation array([20, 40, 60, 80])


# this is the part I am trying to improve
i=0
j=0
arr2=[]
for f in filter1:
    if f:
        arr2.append(arr1[i])
        i=i+1
    else:
        arr2.append(arr[j])
    j=j+1

# output arr2: [1, 20, 3, 40, 5, 60, 7, 80, 9]

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Это способ выполнения поэлементной операции над массивом на основе условия:

arr[arr%2 == 0] *= 10

Обратите внимание, что это не создает новый массив, но изменяет массив.

Если вы хотите новый массив, вы можете скопировать массив после операции:

arr2 = arr.copy()
1 голос
/ 20 апреля 2020
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[a%2 == 0] *= 10
>>> a
array([ 0,  1, 20,  3, 40,  5, 60,  7, 80,  9])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...