【发布时间】:2015-07-08 23:59:53
【问题描述】:
我有两个 numpy 数组
import numpy as np
x = np.linspace(1e10, 1e12, num=50) # 50 values
y = np.linspace(1e5, 1e7, num=50) # 50 values
x.shape # output is (50,)
y.shape # output is (50,)
我想创建一个函数,该函数返回一个形状为 (50,50) 的数组,以便为所有 y 值评估第一个 x 值 x0,等等。
我当前使用的函数相当复杂,所以让我们用一个更简单的例子。假设函数是
def func(x,y):
return x**2 + y**2
如何将其塑造为 (50,50) 数组?目前,它将输出 50 个值。你会在数组中使用 for 循环吗?
类似:
np.array([[func(x,y) for i in x] for j in y)
但不使用两个 for 循环。这需要很长时间才能运行。
编辑:有人要求我分享我的“复杂”功能。就是这样:
有一个数据向量,它是一个包含 4000 个测量值的一维 numpy 数组。还有一个“normalized_matrix”,形状为 (4000,4000)——没什么特别的,只是一个输入值介于 0 和 1 之间的整数的矩阵,例如0.5567878。这是两个“给定”输入。
我的函数返回 transpose(datavector) * matrix * datavector 的矩阵乘积,它是单个值。
现在,正如您在代码中看到的那样,我已经初始化了两个数组,x 和 y,它们传递了一系列“x 参数”和“y 参数”。也就是说,func(x,y) 为值x1 和值y1(即func(x1,y1))返回什么?
matrix1 的形状是 (50, 4000, 4000)。 matrix2 的形状是 (50, 4000, 4000)。 total_matrix 同上。
normalized_matrix 是形状 (4000,4000),id_mat 是形状 (4000,4000)。
normalized_matrix
print normalized_matrix.shape #output (4000,4000)
data_vector = datarr
print datarr.shape #output (4000,)
def func(x, y):
matrix1 = x [:, None, None] * normalized_matrix[None, :, :]
matrix2 = y[:, None, None] * id_mat[None, :, :]
total_matrix = matrix1 + matrix2
# transpose(datavector) * matrix * datavector
# by matrix multiplication, equals single value
return np.array([ np.dot(datarr.T, np.dot(total_matrix, datarr) ) ])
如果我尝试使用np.meshgrid(),即如果我尝试
x = np.linspace(1e10, 1e12, num=50) # 50 values
y = np.linspace(1e5, 1e7, num=50) # 50 values
X, Y = np.meshgrid(x,y)
z = func(X, Y)
我收到以下值错误:ValueError: operands could not be broadcast together with shapes (50,1,1,50) (1,4000,4000)。
【问题讨论】:
-
我对你想要的输出感到困惑。如果输出50× 50的矩阵是M,你期待
M[i, j]的公式是什么? -
x0从y0评估到y49,然后x1在y0评估到y49,等等。 -
这是似曾相识,并已在其替代化身 stackoverflow.com/questions/31304733/… 中得到解答
-
你试过
np.meshgrid但没有用? -
已编辑的问题,更详细的
func很有帮助。但是您应该指出ValueError出现的位置。人们喜欢对忽略这类信息投反对票。请参阅我的第二个答案。