Определяемая пользователем функция: операнды не могут передаваться вместе

Я работаю над этим кодом.

Я понимаю, в чем проблема, которая четко указана в ValueError. Я хочу знать, есть ли хороший способ обойти мою проблему. То есть для разработки функции, которая может принимать массив (400 400) и для каждого отдельного элемента (t1,t2) в этом 2d-массиве я хочу выполнить функцию J(t1,t2), которая включает в себя 1d-массив длиной 50. Имеет ли это смысл? Спасибо!

import numpy as np
import matplotlib.pylab as plt

X = np.linspace(0,10)
a = 1
b = 2
Y = a + b * X + np.random.normal(1,0.1,X.shape)*np.random.normal(20,0.1,X.shape)

def J(theta0, theta1):
    return np.sum((theta0 + X*theta1 - Y)**2)

delta = 0.025
theta0 = np.arange(-5,5,delta)
theta1 = np.arange(-5,5,delta)
T1, T2 = np.meshgrid(theta0, theta1)
Z = J(T1,T2)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-28-9956753b05ce> in <module>()
      6 theta1 = np.arange(-5,5,delta)
      7 T1, T2 = np.meshgrid(theta0, theta1)
----> 8 Z = J(T1,T2)
      9 

<ipython-input-28-9956753b05ce> in J(theta0, theta1)
      1 def J(theta0, theta1):
----> 2     return np.sum((theta0 + X*theta1 - Y)**2)
      3 
      4 delta = 0.025
      5 theta0 = np.arange(-5,5,delta)

ValueError: operands could not be broadcast together with shapes (50,) (400,400) 

Я могу определенно рассчитать Z, написав цикл. Но мне было интересно, есть ли хороший способ обойти это. Спасибо!

0 ответов

Для всех, кто может прийти сюда из поиска Google (как и я), есть способ решить эту проблему с помощью метода numpy vectorize ():

X = np.linspace(0,10)
a = 1
b = 2
Y = a + b * X + np.random.normal(1,0.1,X.shape)*np.random.normal(20,0.1,X.shape)

def J(theta0, theta1):
    return np.sum((theta0 + X*theta1 - Y)**2)

delta = 0.025
theta0 = np.arange(-5,5,delta)
theta1 = np.arange(-5,5,delta)
T1, T2 = np.meshgrid(theta0, theta1)
vJ = np.vectorize(J)   #Just add this
Z = vJ(T1,T2)

Однако, как сказано в документации, это, по сути, цикл for, поэтому я сомневаюсь в его производительности на больших данных.

Другие вопросы по тегам