Функция, которая изменяет знак элементов в массиве, если выполняются условия между a и b - PullRequest
0 голосов
/ 21 марта 2020

Изменить знак элементов в массиве numpy с a на b. Я попробовал это.

import numpy as np
def do_negative(X, a, b):
    lst = []
    for i in X:
      if (a<i<b):
        lst.append(-i)
      else:
        lst.append(i)
    return X
test = np.array(range(9)).reshape(3,3)
do_negative(test, -1, 3).all()

Но это возвращает ошибку ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Входные данные: от -1 до 3.

Вывод должен быть: np.array ([[0, -1, -2], [-3, 4, 5], [6, 7, 8]])

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Попробуйте:

X это массив 2D numpy, вы должны сделать его 1D, используя flatten(). Также вы возвращаете X вместо возврата lst

def do_negative(X, a, b):
  lst = []
  for i in X.flatten():
    if (a < i <= b):
      lst.append(-1*i)
    else:
      lst.append(i)
  return np.array(lst).reshape(3,3)

Удалить .all() при вызове функции

do_negative(test, -1, 3)

Вывод:

array([[ 0, -1, -2],
       [-3,  4,  5],
       [ 6,  7,  8]])
0 голосов
/ 21 марта 2020

Использование for циклов для поэлементных операций над массивами - это не то, как NumPy предполагается использовать.

Это можно сделать довольно легко с помощью операции с целым массивом:

def do_negative(x, a, b):
    result = x.copy()
    result[(a < x) & (x < b)] *= -1
    return result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...