首页 > 解决方案 > 如何使用嵌套的 for 循环迭代地附加表示空间 x 和 y 场景的数据框?

问题描述

我正在尝试创建一个数据框来表示地形表达式。到目前为止,我已经编写了一对 for 循环,它们可以单独用于表示 x 和 y 轴,特别是在表格中,

a = []   
for x in range(1,i,1):
    x1 = some function of x
    x2 = another function of x 
    a.append({'a':x, 'b':x1, 'c': x2})
xaxis = pd.DataFrame(a)

对于 x 轴,并且,

a = []
for y in range(-j, j, 1):
    y1 = some function of y   
    a.append({'a':y,'b':y1})
yaxis = pd.DataFrame(a)

对于 y 轴。

这一切都很简单并且工作正常,但是......

我想对此进行扩展,以便在 x 轴循环的每次迭代中重复 y 轴循环,并使 y1 函数取决于 x 轴循环的参数。我走到这一步,

a = []   
for x in range(1,i,1):
    x1 = some function of x
    x2 = another function of x 
    for y in range(-j, j, 1):
        y1 = some function of y that calls x2
    a.append({

我很难过。

我追求的输出本质上是这样的,

x    x1      x2     y    y1       
     x1(1)   x2(1)  -j   y1(1,-j)  
1    x1(1)   x2(1)  0    y1(1,0)   
     x1(1)   x2(1)  j    y1(1,j)      
     x1(2)   x2(2)  -j   y1(2,-j)  
2    x1(2)   x2(2)  0    y1(2,0)   
     x1(2)   x2(2)  j    y1(2,j)  
....

依此类推到 x = i。

最终的愿望是拥有可以绘制在 2D 直方图中的数据

如果有更好的方法可以做到这一点,请告诉我,这只是我目前能想到的唯一方法,可能会得到我想要的结果。

编辑:事实证明这可以使用 numpy 数组非常有效地完成。这是我最终如何实现这个目标的一般表达,

y1 = lambda x,y: f(x,y)
np.array( [ [ y1(x,y) for x in xrange(1,i,1)] for y in xrange(-j,j,1)] )

标签: pythonpandas

解决方案


您必须找到函数的矢量化版本。这可以通过使用numpy的几个矢量化函数或使用numpy.vectorized(). 看看那个例子:

import numpy as np

def f1(x):
    return x**2

def f2(x):
    return np.abs(x)

def f3(x,y):
    return x**2 + y**2

i = 3 ; j = 2
x = np.arange(1,i,1)
y = np.arange(-j,j,1)

# Now build cartesian product of x and y
xy = np.array([np.tile(x, len(y)), np.repeat(y, len(x))])
xy
array([[ 1,  2,  1,  2,  1,  2,  1,  2],
       [-2, -2, -1, -1,  0,  0,  1,  1]])

x1 = f1(xy[0,])
x1
array([1, 4, 1, 4, 1, 4, 1, 4], dtype=int32)

x2 = f2(xy[0,])
x2
array([1, 2, 1, 2, 1, 2, 1, 2])

y1 = f3(xy[0,], xy[1,])
y1
array([5, 8, 2, 5, 1, 4, 2, 5], dtype=int32)

推荐阅读