在Python中优雅地初始化n维矩阵

时间:2014-10-23 16:45:38

标签: python

关于如何初始化二维矩阵,有几个关于SO的问题,答案是这样的:

matrix = [[0 for x in range(10)] for x in range(10)]

有没有办法将此概括为n维而不使用for block或写出非常长的嵌套列表理解?

4 个答案:

答案 0 :(得分:0)

由于整数是不可变的,因此您可以将代码缩减为:

matrix = [[0] * 10 for x in range(10)]

如评论中提到的@iCodez,如果NumPy是一个选项,您只需执行以下操作:

import numpy as np                                              
matrix = np.zeros((10, 10)) 

答案 1 :(得分:0)

如果你真的想要一个矩阵,np.zerosnp.ones可以快速创建这样的二维数组来实例化一个矩阵:

import numpy as np
my_matrix = np.matrix(np.zeros((10,10)))

要概括为n维,您不能使用矩阵,根据定义,该矩阵为2维:

n_dimensions = 3
width = 10

n_dimensional_array = np.ones((width,) * n_dimensions)

答案 2 :(得分:-1)

我同意如果numpy是一个选项,它是一种更容易使用矩阵的方法。我强烈推荐它。

话虽这么说,这个递归函数是将代码推广到n维的合理方法。第一个参数是一个列表或元组,指定每个维度的大小(以及间接的维度)。第二个参数是填充矩阵的常量值(在您的示例中为0):

def init(sizes, value=0):
    if (len(sizes) == 1):
        return [value] * sizes[0]
    else:

        # old code - fixed per comment. This method does not create
        # sizes[0] *new* lists, it just repeats the same list
        # sizes[0] times. This causes unexpected behavior when you
        # try to set an item in a list and all of its siblings get
        # the same change
        # return [init(sizes[1:], value)] * sizes[0]

        # this method works better; it creates a new list each time through
        return [init(sizes[1:], value) for i in xrange(sizes[0])]

matrix = init((2,3,4), 5)
matrix[0][0][0] = 100 # setting value per request in comment
print matrix
>>> [[[100, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]], [[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]]]

N维数组在2D屏幕上打印有点困难,但您可以在我手动缩进的片段中更轻松地看到matrix的结构。它是一个长度为2的数组,包含长度为3的数组,包含长度为4的数组,其中每个值都设置为5:

[
    [
        [100, 5, 5, 5],
        [5, 5, 5, 5],
        [5, 5, 5, 5]
    ],
    [
        [5, 5, 5, 5],
        [5, 5, 5, 5],
        [5, 5, 5, 5]
    ]
]

答案 3 :(得分:-1)

@ brian-putman越来越好......无论如何,这是我的解决方案:

init = lambda x, y: [init(x, y-1) if y>1 else 0 for _ in xrange(x)]

仅生成大小为x的方形矩阵,在y维中填充零。这样称呼

init(5, 3)

[[[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]],
 [[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]],
 [[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]]]