3D数据的最佳数据结构是什么?

5

我有一些数据,这些数据是两个变量的函数,假设为a和b。

f(a,b)

从数学角度来看,我们可以将f视为在三维中查看的表面。问题在于,什么是存储这些数据的好的数据结构?我需要绘制f作为a的函数(b为常量)以及f作为b的函数(a为常量)。目前,我正在使用一个数组字典,就像这样:

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

但是如果我现在想将f作为a的函数与b恒定地绘制出来,我就必须手动重新创建另一个字典:

  f['b1'] = [a1,a2,a3]

这种方法非常繁琐,导致我的代码难以阅读。是否有一种不错的方式将这种3D数据存储在numpy数据结构或使用Python内置数据结构中?

3个回答

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

我不明白这与您最初的描述有何关系。您说f是两个变量的函数... 我认为您将它们误标为“b”。

使用普通Python列表的示例

您可以将二维数组轻松存储为列表的列表(参见Iliffe向量)。这将给您以下结果:

_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]

3

如果您的数据是3D空间中的表面,存储的自然方式应该是有两个独立变量的唯一值向量a和b,并且一个2D数组,其中包含对您的两个向量的笛卡尔积调用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接