给出一个函数f(u,v) -> z
,该函数将2个对象(例如BitVectors)作为输入并返回单个输出值z
。在对它们调用函数f
之前,如何将使用np.meshgrid创建的两个2d int数组映射到2d对象数组?
import numpy as np
from BitVector import BitVector
def f(u : BitVector, v : BitVector) ->float:
# ..
return my_float
# Vectors of objects
x_bitv = [BitVector(intVal = i) for i in range(3)]
y_bitv = [BitVector(intVal = i) for i in range(4)]
# Vectors of integers (index lists)
x_index = [_ for _ in range(len(x_bitv))]
y_index = [_ for _ in range(len(y_bitv))]
X, Y = np.meshgrid(x_index, y_index) # X and Y are 2d int arrays
# z=f(x_bitv[i],y_bitv[j]) with i elementOf(x_index) and j elementOf(y_index)
Z = f(X,Y) # error: function f expects 2 BitVector parameters, not 2 integer vectors
如何正确计算Z值? 预期输出:
print(X):
[[0 1 2]
[0 1 2]
[0 1 2]
[0 1 2]]
print(Y)
[[0 0 0]
[1 1 1]
[2 2 2]
[3 3 3]]
print(Z)
[[0.1 0.0 0.2]
[1.2 1.1 1.4]
[2.2 2.4 2.7]
[3.5 3.9 3.9]]
此处Z包含计算值。 X,Y,Z数组的目的是按照此示例绘制3d图:Plotting 3D surface graphs with lists
答案 0 :(得分:0)
我可能会误解这个问题-您希望将meshgrid的输出(X = 2D整数数组,Y = 2D整数数组)映射到BitVector对象中,以便可以应用f(u,v)-> z取值。
我试图用map和reduce函数简洁地做到这一点。
#Map X and Y to 1D lists of BitVector values
X_bitv = reduce(list.__add__,list(map(lambda a : list(map(lambda b: BitVector(intVal=b),a)), X)))
Y_bitv = reduce(list.__add__,list(map(lambda a : list(map(lambda b: BitVector(intVal=b),a)), Y)))
#invoke f(u,v) on them and store values in list
Zlist = [f(X_bitv[i],X_bitv[i]) for i in range (len(X_bitv))]
代码现在运行。
答案 1 :(得分:0)
事实证明,有一个相当简单的解决方案:
Z = np.array([f(x,y) for y in y_bitv for x in x_bitv]).reshape(len(y_bitv),len(x_bitv))
也就是说,首先我们用解f(x,y)创建一维列表,然后将其重塑为所需的矩阵格式。
答案 2 :(得分:0)
我正在手机上写这篇文章,所以未经测试。
fn = np,frompyfunc(f, 2,1)
c =fn( np.array(x_bit)[:,None], np.array(y_bit))