Невозможно назначить в массиве NumPy - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу возвести в квадрат четные значения индекса в массиве numpy и назначить его в этом массиве. Я следовал 2 подходам.

1 -

for i in range(len(arr)):
        if i %2 == 0:
            arr[i] = arr[i]**2

Это работает.

2 -

arr[i] = arr[i]**2 for i in range(len(arr)) if i % 2 == 0

 File "<ipython-input-149-30fc7ed25f1f>", line 1
    arr[i] = arr[i]**2 for i in range(len(arr)) if i % 2 == 0
                     ^
SyntaxError: invalid syntax

не работает.

Некая ли синтаксическая ошибка?

Ответы [ 3 ]

2 голосов
/ 26 апреля 2019

Это работает со списком:

arr = [arr[i]**2 if i % 2 == 0 else arr[i] for i in range(len(arr))]

Но вы также можете использовать более короткое:

arr[::2] = arr[::2]**2
0 голосов
/ 26 апреля 2019

Не зацикливайтесь на массивах numpy, вы теряете всю мощь numpy.

Используйте эти функции для достижения требуемого результата:

import numpy as np
arr = np.random.randint(0,10, size=(10,))
print(arr)
ans = np.where(np.arange(10) % 2 == 0, arr, arr**2)
print(ans)

выход:

[ 1 9   1  1  0 6   5  2  1 5 ]
[ 1 81  1  1  0 36  5  4  1 25]

np.where выбирает элементы, где условие выполняется. Затем выводит либо исходный массив, либо массив в квадрате.

Документы для np.where .

0 голосов
/ 26 апреля 2019

Я предполагаю, что вы пытаетесь сделать понимание списка , для которого ваш синтаксис немного отключен, прочитайте синтаксис понимания списка.
Его синтаксис похож на [exp1(item) if condition1 else exp2(item) for item in arr].
Правильный способ сделать это следующим образом.

arr = [1,2,3,4,5,6]
arr = [arr[i]**2 if i % 2 == 0 else arr[i] for i in range(len(arr))]
print(arr)
#[1, 2, 9, 4, 25, 6]

То, что он делает, - это запуск цикла for, проверка условия, а затем выбор либо arr[i] или arr[i]**2, а затем присвоениерезультат к списку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...