Pyplot массива с оператором <или>

Я пытаюсь построить функцию в Python с pyplot, где проблема может быть сведена к следующему:

import numpy as np import matplotlib.pyplot as plt def func(x): if x<0: return x*x interval = np.arange(-4.0,4.0,0.1) plt.plot(interval, func(interval)) plt.show() 

Что вызывает следующую ошибку:

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

Как я могу избежать этого?

2 Solutions collect form web for “Pyplot массива с оператором <или>”

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

 import numpy as np def func(x): return np.where(x < 0, x*x, x) print(func(np.arange(-4, 5))) # array([16, 9, 4, 1, 0, 1, 2, 3, 4]) 

Если вам просто нужны значения ниже нуля, вы можете использовать индексирование с булевым массивом :

 def func(x): return x[x<0] ** 2 print(func(np.arange(-4, 5))) # array([16, 9, 4, 1]) 

Более общие: операторы сравнения на numpy.array s просто возвращают булевский массив:

 >>> arr > 2 array([False, False, True], dtype=bool) >>> arr == 2 array([False, True, False], dtype=bool) 

И исключение

ValueError: Значение истины массива с более чем одним элементом неоднозначно. Используйте команды a.any () или a.all ()

происходит, когда вы делаете bool(somearray) . Во многих случаях вызов bool() неявный (так что, возможно, он не может быть сразу же очевидным, чтобы его обнаружить). Примерами этого неявного вызова bool() являются if , while , and and or :

 >>> import numpy as np >>> arr = np.array([1, 2, 3]) >>> bool(arr) ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() >>> if arr: pass ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() >>> while arr: pass ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() >>> arr and arr ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() >>> arr or arr ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

В вашем случае if x < 0 был причиной исключения, потому что x < 0 возвращает логический массив, а затем, if попытается получить bool() этого массива. Как показано в приведенном выше примере, вы получаете исключение, которое вы получили.

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

Итак, давайте предположим, что у вас есть функция

 def func(x): if x<0: return x*x else: return 2*x 

Теперь что-то вроде func(np.arange(-4,4,0.1)) не будет работать, потому что половина значений x положительна, а половина отрицательна. Если вы спросите, является ли x положительным, ответ будет «это зависит …». И об этом говорит вам ошибка.

Поэтому вам нужно будет убедиться, что функция обрабатывает входной массив пополам. Для этого вы можете использовать numpy.vectorize .

 func2 = np.vectorize(func) interval = np.arange(-4.0,4.0,0.1) plt.plot(interval, func2(interval)) 

который затем отображает желаемый результат.

Вы также можете решить напрямую написать функцию, которая принимает массив как входной. Пример сверху может выглядеть так:

 def func3(x): return x*x*(x<0) + 2*x*(x>=0) 
  • Почему «Нет» имеет тот же эффект, что и «np.newaxis»?
  • Преодолеть ValueError для пустого массива
  • Исключить белые грани в Matplotlib / Basemap pcolor plot
  • Python создает меньшую подматрицу из большего массива 2D NumPy?
  • Черный вуду из NumPy Einsum
  • Индексирование одного массива другим в numpy
  • Поднять до 1/3 дает комплексное число
  • Нумерованный эквивалент list.index
  • Python - лучший язык программирования в мире.