使用Python创建3D数组

Laí*_*llo 36 python arrays multidimensional-array python-2.7

我想在Python(2.7)中创建一个3D数组,使用如下:

distance[i][j][k]
Run Code Online (Sandbox Code Playgroud)

并且数组的大小应该是我拥有的变量的大小.(N*N*N)

我试过用:

distance = [[[]*n]*n]
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.

有任何想法吗?非常感谢!

编辑:我只能使用deafult库,乘法的方法(即[[0]*n]*n)不会工作,因为它们链接到同一个指针,我需要所有的值都是个体的

EDIT2:已经通过以下答案解决了.

rob*_*ert 61

你应该使用列表理解:

>>> import pprint
>>> n = 3
>>> distance = [[[0 for k in xrange(n)] for j in xrange(n)] for i in xrange(n)]
>>> pprint.pprint(distance)
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]],
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
>>> distance[0][1]
[0, 0, 0]
>>> distance[0][1][2]
0
Run Code Online (Sandbox Code Playgroud)

您可能已经生成了一个数据结构,其中的语句看起来与您尝试过的语句类似,但由于内部列表是按引用复制的,因此会产生副作用:

>>> distance=[[[0]*n]*n]*n
>>> pprint.pprint(distance)
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]],
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
>>> distance[0][0][0] = 1
>>> pprint.pprint(distance)
[[[1, 0, 0], [1, 0, 0], [1, 0, 0]],
 [[1, 0, 0], [1, 0, 0], [1, 0, 0]],
 [[1, 0, 0], [1, 0, 0], [1, 0, 0]]]
Run Code Online (Sandbox Code Playgroud)


mat*_*ata 30

numpy.arrays仅针对此案例设计:

 numpy.zeros((i,j,k))
Run Code Online (Sandbox Code Playgroud)

会给你一个尺寸为i j k 的数组,用零填充.

根据您的需要,numpy可能是适合您需求的库.

  • 不,不幸的是它是一个外部库.但如果你需要处理(大)数值数据数组,通常非常适合.特别是速度是一个问题. (3认同)

ham*_*ene 7

正确的方法是

[[[0 for _ in range(n)] for _ in range(n)] for _ in range(n)]
Run Code Online (Sandbox Code Playgroud)

(你要做的就是写(对于NxNxN)

[[[0]*n]*n]*n
Run Code Online (Sandbox Code Playgroud)

但这不正确,请参阅@Adaman评论为什么).

  • 不好。它将包含对同一数组的引用。试试这个:`a = [[0] * 3] * 3; a [0] [0] = 1; 打印` (3认同)

alb*_*uno 5

d3 = [[[0 for col in range(4)]for row in range(4)] for x in range(6)]

d3[1][2][1]  = 144

d3[4][3][0]  = 3.12

for x in range(len(d3)):
    print d3[x]



[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 144, 0, 0], [0, 0, 0, 0]]
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [3.12, 0, 0, 0]]
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)


Nai*_*wal 5

"""
Create 3D array for given dimensions - (x, y, z)

@author: Naimish Agarwal
"""


def three_d_array(value, *dim):
    """
    Create 3D-array
    :param dim: a tuple of dimensions - (x, y, z)
    :param value: value with which 3D-array is to be filled
    :return: 3D-array
    """

    return [[[value for _ in xrange(dim[2])] for _ in xrange(dim[1])] for _ in xrange(dim[0])]

if __name__ == "__main__":
    array = three_d_array(False, *(2, 3, 1))
    x = len(array)
    y = len(array[0])
    z = len(array[0][0])
    print x, y, z

    array[0][0][0] = True
    array[1][1][0] = True

    print array
Run Code Online (Sandbox Code Playgroud)

更喜欢用于numpy.ndarray多维数组。