我有一个小问题,我想翻译成Python.因此我需要一个多维数组.在Java中它看起来像:
double dArray[][][] = new double[x.length()+1][y.length()+1][x.length()+y.length()+3]; dArray[0][0][0] = 0; dArray[0][0][1] = POSITIVE_INFINITY;
将创建更多值bei循环并将其写入数组.
如何实例化数组?
PS:没有涉及矩阵乘法......
如果您将自己限制在Python标准库中,那么列表列表是最接近的构造:
arr = [[1,2],[3,4]]
给出一个类似2d的数组.该行可以作为访问arr[i]
的i
在{0,..,len(arr}
,但列的访问是困难的.
如果您愿意添加库依赖项,那么NumPy包就是您真正想要的.您可以使用以下命令从列表列表中创建固定长度的数组:
import numpy arr = numpy.array([[1,2],[3,4]])
列存取相同的列表的清单,但列访问很简单:arr[:,i]
对于i
在{0,..,arr.shape[1]}
(列数).
事实上,NumPy数组可以是n维的.
可以使用创建空数组
numpy.empty(shape)
shape
每个维度中的大小元组在哪里; shape=(1,3,2)
给出一个3维阵列,第一维尺寸为1,第二维尺寸为3,第三维尺寸为2.
如果要将对象存储在NumPy数组中,也可以这样做:
arr = numpy.empty((1,), dtype=numpy.object) arr[0] = 'abc'
有关NumPy项目的更多信息,请查看NumPy主页.
要创建任意大小的标准python数组:
a = [[0]*cols for _ in [0]*rows]
它是这样访问:
a[0][1] = 5 # set cell at row 0, col 1 to 5
值得一提的是一个小小的蟒蛇:它很有吸引力
a = [[0]*cols]*rows
但是这会将相同的列数组复制到每一行,从而导致不必要的行为.即:
>>> a[0][0] = 5 >>> print a[1][0] 5
您可以使用嵌套列表创建它:
matrix = [[a,b],[c,d],[e,f]]
如果它必须是动态的,那就更复杂了,为什么不自己写一个小班?
class Matrix(object): def __init__(self, rows, columns, default=0): self.m = [] for i in range(rows): self.m.append([default for j in range(columns)]) def __getitem__(self, index): return self.m[index]
这可以这样使用:
m = Matrix(10,5) m[3][6] = 7 print m[3][6] // -> 7
我相信我可以更有效地实现它.:)
如果你需要多维数组,你可以创建一个数组并计算偏移量,或者你在数组中的数组中使用数组,这对内存来说可能非常糟糕.(可能会更快......)我已经实现了第一个这样的想法:
class Matrix(object): def __init__(self, *dims): self._shortcuts = [i for i in self._create_shortcuts(dims)] self._li = [None] * (self._shortcuts.pop()) self._shortcuts.reverse() def _create_shortcuts(self, dims): dimList = list(dims) dimList.reverse() number = 1 yield 1 for i in dimList: number *= i yield number def _flat_index(self, index): if len(index) != len(self._shortcuts): raise TypeError() flatIndex = 0 for i, num in enumerate(index): flatIndex += num * self._shortcuts[i] return flatIndex def __getitem__(self, index): return self._li[self._flat_index(index)] def __setitem__(self, index, value): self._li[self._flat_index(index)] = value
可以像这样使用:
m = Matrix(4,5,2,6) m[2,3,1,3] = 'x' m[2,3,1,3] // -> 'x'
看看numpy
这是给你的代码片段
import numpy as npy d = npy.zeros((len(x)+1, len(y)+1, len(x)+len(y)+3)) d[0][0][0] = 0 # although this is unnecessary since zeros initialises to zero d[i][j][k] = npy.inf
我认为你不需要实施一个科学的应用来证明使用numpy是合理的.它更快,更灵活,您可以存储几乎任何东西.鉴于我认为尝试并证明不使用它可能更好.有合理的理由,但它增加了很多,而且成本很低,值得考虑.
PS你的阵列长度合适吗?它看起来像一个非常奇特的形状矩阵......
多维数组有点模糊.使用它们的原因很少,并且有很多理由可以考虑两次并使用其他更恰当反映您正在做的事情.[暗示.你的问题在上下文中很薄;-)]
如果您正在进行矩阵数学运算,那么请使用numpy
.
然而,有些人使用的语言迫使他们使用多维数组,因为这是他们所拥有的.如果你和我一样老(我在70年代开始编程)那么你可能还记得多维数组是你拥有的唯一数据结构的日子.或者,您的经验可能限制您使用必须将问题转换为多维数组的语言.
假设你有一个集合ñ 3D点.每个点都有x,y,z和时间值.这是一个n x 4阵列吗?还是4*n阵列?并不是的.
由于每个点都有4个固定值,因此更准确地说是元组列表.
a = [ ( x, y, z, t ), ( x, y, z, t ), ... ]
更好的是,我们可以将其表示为对象列表.
class Point( object ): def __init__( self, x, y, z, t ): self.x, self.y, self.z, self.t = x, y, z, t a = [ Point(x,y,x,t), Point(x,y,z,t), ... ]
如果您可以使用稀疏数组,则可以使用dict来存储值.Python的dicts允许你使用元组作为键,因此,你可以分配和访问"稀疏数组"的元素(这里真的是一个字典),如下所示:
d = {} d[0,2,7] = 123 # assign 123 to x=0, y=2, z=7 v = d[0,2,7]