Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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中优雅地初始化n维矩阵_Python - Fatal编程技术网

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

在Python中优雅地初始化n维矩阵,python,Python,关于如何初始化二维矩阵,有几个问题,答案如下: matrix = [[0 for x in range(10)] for x in range(10)] 有没有办法将其推广到n维,而不使用for block或写出很长的嵌套列表?由于整数是不可变的,您可以将代码简化为: matrix = [[0] * 10 for x in range(10)] 如评论中所述,如果NumPy是一个选项,您只需执行以下操作: import numpy as np

关于如何初始化二维矩阵,有几个问题,答案如下:

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

有没有办法将其推广到n维,而不使用for block或写出很长的嵌套列表?

由于整数是不可变的,您可以将代码简化为:

matrix = [[0] * 10 for x in range(10)]
如评论中所述,如果NumPy是一个选项,您只需执行以下操作:

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

如果您确实想要一个矩阵,
np.zero
np.one
可以快速创建这样一个二维数组来实例化矩阵:

import numpy as np
my_matrix = np.matrix(np.zeros((10,10)))
要推广到n维,不能使用矩阵,根据定义,矩阵是二维的:

n_dimensions = 3
width = 10

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

我同意,如果numpy是一个选项,那么使用矩阵就更容易了。我极力推荐

也就是说,这个递归函数是一种合理的方法,可以将代码概括为n维。第一个参数是一个列表或元组,指定每个维度应该有多大(间接地说,还有多少维度)。第二个参数是填充矩阵的常量值(在您的示例中,
0
):

在2D屏幕上打印N维数组有点困难,但在我手动缩进的代码片段中,您可以更容易地看到矩阵的结构。它是一个长度为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]
    ]
]

@布莱恩·普特曼更快更好。。。无论如何,这是我的解决方案:

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

无论何时使用矩阵,都应该考虑使用。这是非常有效的,并且是为此目的而设计的。可能的重复我认为这可能是初始化矩阵的标准问题,但否则它可能是重复的。做
矩阵[0][0]=100
然后打印
矩阵
?@AshwiniChaudhary很好,谢谢。我将您的代码片段更改为
matrix[0][0][0]=100
,因为这是一个3D数组(我想这就是您的意思吧?)。现在编辑的代码通过检查了吗?
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]]]