目标:计算一些二元多项式,例如f(x,y(=sin(x^2+y^2(,对于x∈[-1,1]和y∈[-1,1],并在数据帧中粘贴值。
我所拥有的。。。
def sunbrero(x,y):
return np.sin(x**2 + y**2)
lower=-1
upper=1
length=1000
X = np.linspace(lower, upper, num=length)
Y = np.linspace(lower, upper, num=length)
Z = pd.DataFrame(index=X,columns=Y)
# [[sunbrero(x,y) for x in X] for y in Y]
for y in Y:
Z[y] = [sunbrero(x,y) for x in X]
我希望做的是取代。。。
for y in Y:
Z[y] = [sunbrero(x,y) for x in X]
像。。。
[[Z[y] = sunbrero(x,y) for x in X] for y in Y]
但很明显,上述方法并不奏效。
我知道这是有效的。。。
Z = [[sunbrero(x,y) for x in X] for y in Y]
但它创建的是列表列表,而不是数据帧。
注1:如果其他人认为2D向量是更合理的c.f数据帧,我也持开放态度。
注意2:我认为lambda函数不起作用,因为它只允许定义一个变量。很高兴被纠正。
我认为更像熊猫式的方法是首先计算的值,然后将它们放入数据帧中,而不是相反。在列表理解中执行计算并不能很好地利用Numpy和Pandas的内部向量优化。
相反,你可以利用Numpy的广播首先获得矩阵:
length = 5
X = np.linspace(lower, upper, num=length)
Y = np.linspace(lower, upper, num=length)
result = sunbrero(X[:, None], Y)
array([[0.90929743, 0.94898462, 0.84147098, 0.94898462, 0.90929743],
[0.94898462, 0.47942554, 0.24740396, 0.47942554, 0.94898462],
[0.84147098, 0.24740396, 0. , 0.24740396, 0.84147098],
[0.94898462, 0.47942554, 0.24740396, 0.47942554, 0.94898462],
[0.90929743, 0.94898462, 0.84147098, 0.94898462, 0.90929743]])
并将其放入一个数据帧中,如下所示:
df = pd.DataFrame(result, index=X, columns=Y)
-1.0 -0.5 0.0 0.5 1.0
-1.0 0.909297 0.948985 0.841471 0.948985 0.909297
-0.5 0.948985 0.479426 0.247404 0.479426 0.948985
0.0 0.841471 0.247404 0.000000 0.247404 0.841471
0.5 0.948985 0.479426 0.247404 0.479426 0.948985
1.0 0.909297 0.948985 0.841471 0.948985 0.909297
您几乎做到了:
df = pd.DataFrame([[sunbrero(x,y) for x in X] for y in Y])
您可以理解列表,然后让panda从列表列表中创建一个数据帧,例如:
list_of_lists = [[1, 2, 3], [4, 5, 6]]
df = pd.DataFrame(list_of_lists)
获取
0 1 2
0 1 2 3
1 4 5 6