如何将2 numpy 2d int数组映射到对象数组

时间:2019-12-18 02:45:46

标签: python-3.x numpy

给出一个函数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

3 个答案:

答案 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))