Python - 多维数组

3 投票
7 回答
6678 浏览
提问于 2025-04-15 16:24

Python本身并不支持多维数组,也就是说,它没有内置的功能来处理像11维这样的复杂数组。我需要开发一个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中有效地实现这个功能(同时保持良好的可读性)呢?

附注:最多支持Python 2.5版本。

7 个回答

1

另一种方法是创建一个一维数组,然后使用需要11个索引参数的函数来读写这个数组。你需要根据每个维度的最大值来计算数组中的位置,这样就能找到你想要的元素。虽然这些获取和设置的函数看起来可能不太好(因为要用到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]

对于更大的数组也是如此。你可以把这个方法推广到可变数量的维度。我可能会把索引和维度放到列表中,然后逐个处理它们。

2

我在这里写了一个 Matrix 类:

Python中的多维数组

你可以这样使用它:

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

由于有很多维度,而且不允许导入任何库,我的基本选择是使用一个由元组索引的字典。这样,你就可以用很简单的语法来进行基本的索引:

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

你可能想把它放在一个类里面,这样可以增加一些简单索引以外的功能。不过,由于我不知道你想要的具体功能是什么(比如初始化/默认值?切片?迭代?等等),所以很难猜测。如果你能准确说明你想用这个“多维数组”做什么,我就能很容易地给你展示最合适的代码!

撰写回答