3D数据的最佳数据结构?

时间:2013-08-22 21:50:27

标签: python data-structures numpy

我有一些数据,这是两个变量的函数,比方说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数据结构?

3 个答案:

答案 0 :(得分:4)

f['a1'] = [b1, b2, b3]

我不知道这与你的初步描述有什么关系。你说f是两个变量的函数......我假设你误导了这些' b'。

常规Python列表的示例

您可以轻松地将二维数组存储为列表列表(请参阅Iliffe vector)。这会给你以下几点:

_f_values = [
        [1, 4, 3],
        [2, 8, 6],
        [0, 7, 5],
    ]
def f(a, b):
    return _f_values[a][b]

使用numpy的ndarray

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空间中的一个表面,那么自然的存储方式就是拥有两个独立变量的两个向量ab,以及一个二维数组使用两个向量的笛卡尔乘积调用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)