代码之家  ›  专栏  ›  技术社区  ›  psihodelia

python-多维数组

  •  3
  • psihodelia  · 技术社区  · 15 年前

    python不提供对多维数组的内置支持。我需要开发一个 11维阵列 以及对其进行操作的一组函数(主要是线性代数、向量算术)。然而, 不允许导入外部库 . 我用C语言编写了一个代码,并尝试将其移植到python:

    typedef vec3_t float[3];
    vec3_t Array[dim0][dim1][dim2][dim3][dim4][dim5][dim6][dim7][dim8][dim9][dim10];
    Array[0][0][0][0][0][0][0][0][0][0][1] = {1.0, 0.0, 0.0};
    

    如何在python中有效地实现它(使用 可读性好 )?

    PS:最多2.5版的python。

    7 回复  |  直到 9 年前
        1
  •  6
  •   Alex Martelli    15 年前

    由于维度太多,不允许库导入,我将(作为基本选择)使用由元组索引的字典。这样,您就可以获得非常好的简单索引语法:

    Array = dict()
    Array[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] = [1.0, 0.0, 0.0]
    

    您可能希望将它包装在一个类中,以添加除简单索引之外的功能,但不知道它是什么。 除此之外您还想要的(初始化/默认值?切片?迭代?等等……)这太难猜了。如果您能精确地指定所有您想用这个“多维数组”做的事情,那么就不难向您展示最能提供它的代码了!

        2
  •  2
  •   Community CDub    7 年前

    我写了一篇 Matrix 在此处分类:

    Multidimensional array in Python

    它可以这样使用:

    m = Matrix(4,5,2,6)
    m[2,3,1,3] = 'x'
    m[2,3,1,3] // -> 'x'
    
        3
  •  1
  •   Nate C-K    15 年前

    另一种可能是创建一个一维数组,然后使用带有11个索引参数的函数读/写它。将索引(基于每个维度的最大值)相乘,以计算数组中的位置。get/set函数本身并不是很漂亮(有11个索引),但是一旦编写了它们,get和setting数组索引看起来几乎和c中的一样干净。我不确定与嵌套列表相比性能如何,但我想这是有利的。

    基本概念可以用两个维度表示:

    def readArray2(arr,i1,i2,dim2):
        index = i1 * dim2 + i2
        return arr[index]
    

    但随着尺寸的增加,它变得更加复杂:

    def readArray3(arr,i1,i2,i3,dim2,dim3):
        index = i1 * dim2 * dim3 + i2 * dim3 + i3
        return arr[index]
    

    对于更大的数组,依此类推。您可以将其归纳为维数可变的变量。我可能会将索引和维度放入列表中,然后对它们进行迭代。

        4
  •  1
  •   eswald    15 年前

    一个可能非常清晰的解决方案,尽管性能可能很差,但它将使用一个带有11个元素元组的dict作为键:

    >>> d[0,1,2,3,4,5,6,7,8,9,0] = [1.0, 0.0, 0.0]
    

    这还允许您存储坐标向量并将它们作为单个对象传递:

    >>> coord = (0,1,2,3,4,5,6,7,8,9,0)
    >>> d[coord]
    [1.0, 0.0, 0.0]
    

    您可以使用自己的类或dict的子类来强制密钥完整性:

    >>> class Space(dict):
    >>>     def __setitem__(self, key, value):
    >>>         if len(key) == 11:
    >>>             dict.__setitem__(self, key, value)
    >>>         else:
    >>>             raise IndexError("Keys must be eleven-dimensional vectors.")
    

    您可以使用自己的类来提高性能 __getitem__ / __setitem__ 接口,但一开始甚至不需要这样做。

        5
  •  1
  •   Naimish Agarwal    9 年前
    """
    Create multi-dimensional array for given dimensions - (x1, x2, x3, ..., xn)
    
    @author: Naimish Agarwal
    """
    
    
    def multi_dimensional_array(value, *dim):
        """
        Create multi-dimensional array
        :param dim: a tuple of dimensions - (x1, x2, x3, ..., xn)
        :param value: value with which multi-dimensional array is to be filled
        :return: multi-dimensional array
        """
    
        if len(dim) > 1:
            return [multi_dimensional_array(value, *dim[1:]) for _ in xrange(dim[0])]
        else:
            return [value for _ in xrange(dim[0])]
    
    
    if __name__ == "__main__":
        multi_array = multi_dimensional_array(False, *(2, 3, 1))
        print multi_array
    

    喜欢 numpy.ndarray 对于多维数组。

        6
  •  0
  •   ghostdog74    15 年前

    “多维”只是一个花哨的术语,意思是“许多记忆位置”。如果你从更广泛的意义上看,它们实际上是“一维的”。不管怎样,为了提供一个替代方案,您可以使用字典。

    >>> d={}
    >>> d[0]={}
    >>> d[0][0]="1"
    >>> d[0]
    {0: '1'}
    

    以这种方式创建到第11维度的口述。

        7
  •  0
  •   Anon    9 年前

    您可以使用列表:

    list = [ [ [ '' for i in range(dim0) ] for j in range(dim1) ] for k in range(dim2) ]
    

    等等,在那之后。