5

我有一些数据,它是两个变量的函数,比如说 a 和 b。

f(a,b)

在数学术语中,我们可以将 f 视为以 3D 方式观察的表面。问题是,存储这些数据的好数据结构是什么?我需要将 f 绘制为常数 b 的 a 函数,并将 f 绘制为常数 a 的 b 函数。目前我正在使用数组的字典,如下所示:

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

但是,如果我现在想将 f 绘制为 a 和 b 常数的函数,我必须手动重新制作另一个字典:

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

事实证明这非常麻烦,并且使我的代码不可读。有没有一种很好的方法可以将此类 3D 数据存储在一些 numpy 数据结构中或使用内置的 python 数据结构?

4

3 回答 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]
于 2013-08-22T22:12:25.810 回答
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_)

您现在可以获得与 的特定值abas 的特定值相对应的数据片段:

>>> f_ab[a == 9, :]
array([[15, 27, 41]])

>>> f_ab[:, b==32]
array([[33],
       [35],
       [41],
       [47]])
于 2013-08-22T22:56:58.347 回答
2

ndarray 似乎很合适。请参阅http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html

于 2013-08-22T21:54:29.650 回答