以下代码:
def computerCost(x,y,theta):
m = len(y)
J = np.sum((np.dot(x,theta) - y)**2) /(2*m)
return J
m = 100
x = np.linspace(-5,10,m)
y = np.linspace(1,100,m)
x, y = x.reshape(m,1), y.reshape(m,1)
theta_0 = np.linspace(-10,10,100)
theta_1 = np.linspace(-1,4,100)
X,Y = np.meshgrid(theta_0,theta_1)
###### Here I want to initialize a numpy array with generator.
J_vals = np.array(computerCost(x,y,np.array([a,b])) for a,b in zip(np.ravel(X), np.ravel(Y)) )
print('out:',J_vals)
在Python 3.5中运行此代码给出了:
out:<generator object <genexpr> at 0x0000028ACF28B258>
控制台打印出J_vals是一个生成器。有没有办法将生成器更改为np.ndarrray
?
答案 0 :(得分:5)
您正在寻找np.fromiter
。
这里有一个更简单的例子来演示它的工作原理:
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> np.fromiter((i + j for (i, j) in zip(a, b)), np.float)
array([ 5., 7., 9.])
请注意,您必须提供数据类型作为第二个参数,并且生成器表达式必须用括号括起来,因为它不是唯一的参数。
当我使用您的示例代码尝试此操作时,我收到错误消息称形状未对齐...我猜测它是点积的问题。
答案 1 :(得分:2)
您可以使用NumPy广播来矢量化您的操作,完全不需要Python循环:
def computerCost(x, y, theta):
return np.sum((x * theta - y) ** 2, axis=(0, 1)) / (2 * len(y))
m = 100
x = np.linspace(-5,10,m)[:, None, None]
y = np.linspace(1,100,m)[:, None, None]
theta_0 = np.linspace(-10,10,100)
theta_1 = np.linspace(-1,4,100)
X, Y = np.meshgrid(theta_0,theta_1)
XY = np.stack((X.ravel(), Y.ravel()))[None, :, :]
computerCost(x, y, XY)
# array([ 7442.62878788, 7340.86628993, 7240.13955518, ..., 1322.02086831,
# 1320.72740104, 1320.46969697])