如何使用生成器初始化numpy数组?

3
以下是代码示例:
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.ndarray吗?


你能否尝试解释一下你要解决什么问题?也许你可以对操作进行向量化,从而避免使用 zip()fromiter() - Nils Werner
在你的函数内部,你正在执行np.dot(x, theta),其中x是形状为(100, 1)的数组,而theta的形状为(2,)。这样做是行不通的。你能否尝试解释一下你在这里尝试做什么数学运算? - Nils Werner
@NilsWerner 你说得对。我只想使用最小二乘法来绘制一条线性模型以拟合我的数据。而computerCost函数是用来计算一个theta(矩阵:[theta_0,theta_1])的成本。 - Rosand Liu
请看我的答案,了解如何在不使用for循环和zip的情况下完成它。 - Nils Werner
2个回答

6
你正在寻找 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.])

请注意,你需要在第二个参数中提供数据类型,并且生成器表达式必须用括号括起来,因为它不是唯一的参数。
当我使用你提供的示例代码时,出现了一个错误,说形状不对齐... 我猜这是点积的问题。

非常感谢。你是对的,我应该将 J_vals = np.array(computerCost(x,y,np.array([a,b])) for a,b in zip(np.ravel(X), np.ravel(Y))) 中的 np.arrray([a,b]) 更改为 np.array([[a,b]]),因为点积运算中存在形状问题。 - Rosand Liu

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])

我想知道为什么在 x = np.linspace(-5,10,m)[:, None, None] 中添加 [:,None,Noe],以及为什么这个操作可以很好地工作。@NilsWerner - Rosand Liu
你需要正确排列你的轴才能让 NumPy 广播 正常工作。 - Nils Werner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接