我正在尝试创建一个数据帧来表示地形表达式。到目前为止,我已经编写了一对 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 轴。
这一切都很简单,而且工作正常,但是...
我想对此进行扩展,以便 y 轴循环在 x 轴循环的每次迭代中重复,并使 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)] )
你必须找到函数的矢量化版本。这可以通过使用numpy
的几个矢量化函数或使用numpy.vectorized()
来实现(对于 intstant(。看看这个例子:
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)