我有一些数据,这是两个变量的函数,比方说a和b。
f(a,b)
在数学术语中,我们可以将f视为在3D中观察的曲面。问题是,存储这些数据的良好数据结构是什么?我需要绘制f作为常数b和f的函数作为常数a的b的函数。目前我正在使用数组的字典,如下所示:
f['a1'] = [b1,b2,b3]
但是如果我现在想要将f作为a b函数的函数绘制,我必须手工重新制作另一个dict:
f['b1'] = [a1,a2,a3]
这证明非常麻烦,使我的代码不可读。有没有一种很好的方法可以将这些3D数据存储在一些numpy数据结构中或使用内置的python数据结构?
答案 0 :(得分:4)
f['a1'] = [b1, b2, b3]
我不知道这与你的初步描述有什么关系。你说f是两个变量的函数......我假设你误导了这些' b'。
您可以轻松地将二维数组存储为列表列表(请参阅Iliffe vector)。这会给你以下几点:
_f_values = [
[1, 4, 3],
[2, 8, 6],
[0, 7, 5],
]
def f(a, b):
return _f_values[a][b]
numpy具有多维同构数组的专用类型:ndarray。这肯定会更快。您可以使用:
_f_array = numpy.array([
[1, 4, 3],
[2, 8, 6],
[0, 7, 5],
])
def f(a, b):
return _f_array[a, b]
def f_row(a):
return _f_array[a, :]
def f_col(b):
return _f_array[:, b]
答案 1 :(得分:3)
如果你的数据确实是3D空间中的一个表面,那么自然的存储方式就是拥有两个独立变量的两个向量a
和b
,以及一个二维数组使用两个向量的笛卡尔乘积调用f()
的值。作为一个虚拟的例子:
def f(a, b) :
return a + b
a = np.array([1, 3, 9, 15])
b = np.array([6, 18, 32])
# if your function f is vectorized
f_ab = f(a[:, np.newaxis], b)
# if it is not
f_ab = np.empty((len(a), len(b)), dtype=np.array(f(a[0], b[0])).dtype)
for i, a_ in enumerate(a):
for j, b_ in enumerate(b):
f_ab[i, j] = f(a_, b_)
现在,您可以获得与特定值a
相对应的数据片段,或特定值b
的片段:
>>> f_ab[a == 9, :]
array([[15, 27, 41]])
>>> f_ab[:, b==32]
array([[33],
[35],
[41],
[47]])
答案 2 :(得分:2)