Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-多维数组_Python_C - Fatal编程技术网

Python-多维数组

Python-多维数组,python,c,Python,C,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,

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:最多用于Python2.5版本。

我在这里编写了一个
Matrix
类:

它可以这样使用:

m = Matrix(4,5,2,6)
m[2,3,1,3] = 'x'
m[2,3,1,3] // -> 'x'

由于有这么多维度,而且不允许库导入,我(作为基本选择)会选择一个由元组索引的字典。通过这种方式,您可以获得非常好的语法来进行简单的索引:

Array = dict()
Array[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] = [1.0, 0.0, 0.0]
您可能希望将它封装在一个类中,以便在简单索引之外添加功能,但是,不知道它是什么(初始化/默认值?切片?迭代?等等),这太难猜测了。如果您可以精确地指定您想要使用“多维数组”执行的所有操作,那么向您展示最能提供它的代码应该不难

“多维”只是一个花哨的术语,意思是“许多内存位置”。如果你从更广泛的意义上看,它们只是真正的“一维”。无论如何,要提出一个替代方案,你可以使用字典

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

以这种方式创建DICT到“11”维。

另一种可能是创建一维数组,然后使用包含11个索引参数的函数进行读/写。将索引相乘(基于每个维度的最大值)以计算阵列中的位置。get/set函数本身并没有那么漂亮(有11个索引),但是一旦您编写了它们,获取和设置数组索引将看起来几乎像在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]

对于较大的阵列,依此类推。您可以将其推广到不同数量的维度。我可能会将索引和维度放入列表中,然后对它们进行迭代。

一个可能非常清晰的解决方案,尽管性能可能很差,但会使用带有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.")
您可以通过将自己的类与相同的
\uuu getitem\uuuuu
/
\uuuuuu setitem\uuuu
接口一起使用来提高性能,但一开始甚至不需要这样做。

您可以使用列表:

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

"""
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

我以后需要不同的矩阵乘法,向量arithmetics@psihodelia:在这种情况下,您的选择仅限于使用numpy(外部库)、在internet上查找库或自己编写库。我不确定“以后的不同”是什么意思矩阵乘法与普通乘法不同(老实说,矩阵乘法在11维数组上的定义也不完全相同),也不完全不同于在11维数组上需要执行的“向量算术”。如果您可以用C(或伪代码)编写代码,那么您当然可以用Python编写代码,而且可能更简洁…——但是,为了避免导入任何现有模块,仍然需要进行大量的编码。确切地说,为什么您不能导入一些纯python库,比如
pyarray
,并为自己节省一些工作?-)顺便说一句,尽管brownpencer.com(
pyarray
)的标准位置现在似乎已经关闭,但您仍然可以获得谷歌的缓存副本。