创建空矩阵Python

kir*_*off 10 python arrays initialization vector matrix

我只想用Python创建一个空的10*3*2数组.

我首先想到了这一个,但这不起作用:

parameters = [ [ [] * 2 ]*3 ] * 10
Run Code Online (Sandbox Code Playgroud)

这给了我一个十个向量的向量,其中有三个[]元素:

[[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []], 
[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []]]
Run Code Online (Sandbox Code Playgroud)

也就是说,如果我想访问参数[0] [0] [1]我不在界限,而我想要第三维最内层向量的维度2.

然后我想到了这个

[ [ [[] * 2] ]*3 ] * 10
Run Code Online (Sandbox Code Playgroud)

[[] * 2]想现在会给我带来我想要的东西,一个最里面的两个元素矢量.我知道了

[[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], 
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], 
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]]]
Run Code Online (Sandbox Code Playgroud)

那么,怎么做,或者如何逃避这种初始化?

Kd rgds.

Mat*_*yra 20

我建议你使用Numpy这种东西.它使访问列或行更容易.对于您的用例,您可以这样做

import numpy as np

matrix = np.zeros((2,3,10))
second_col = matrix[:,1,:]
Run Code Online (Sandbox Code Playgroud)

Numpy也会更好地处理你的数据,并且它在Fortran或C中实现了很多矩阵代数,所以当你进行矩阵乘法等时,它在(可能的)未来会更快.


bte*_*tel 19

首先,你应该在最里面的列表中插入一些东西(比如None).其次,当您在最外面的列表中使用乘法时,它会复制内部列表的引用,因此当您更改一个元素时,您还将在所有其他列表中更改此元素:

>> parameters = [ [ [None] * 2 ]*3 ] * 10
>> print parameters
[[[None, None], [None, None], [None, None]],
 [[None, None], [None, None], [None, None]],
 [[None, None], [None, None], [None, None]],
 [[None, None], [None, None], [None, None]],
 [[None, None], [None, None], [None, None]],
 [[None, None], [None, None], [None, None]],
 [[None, None], [None, None], [None, None]],
 [[None, None], [None, None], [None, None]],
 [[None, None], [None, None], [None, None]],
 [[None, None], [None, None], [None, None]]]
>> parameters[0][0][1]=1
>> print parameters 
[[[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]]]
Run Code Online (Sandbox Code Playgroud)

因此,您应该使用列表推导:

>> parameters=[[[None for i in range(2)] for j in range(3)] for k in range(10)]
Run Code Online (Sandbox Code Playgroud)

但是,我建议numpy按照其他答案中的建议使用.


Ash*_*ary 6

我会做这样的事情,使用这个列表创建的是不同的对象(即不同的id()):

In [96]: [ [ [ []*2] for _ in range(3)] for _ in range(10) ]
Out[96]: 
[[[[]], [[]], [[]]],
 [[[]], [[]], [[]]],
 [[[]], [[]], [[]]],
 [[[]], [[]], [[]]],
 [[[]], [[]], [[]]],
 [[[]], [[]], [[]]],
 [[[]], [[]], [[]]],
 [[[]], [[]], [[]]],
 [[[]], [[]], [[]]],
 [[[]], [[]], [[]]]]

In [98]: [id(x) for x in lis]   #all objects are unique
Out[98]: 
[151267948,
 151268076,
 151268492,
 151269164,
 151267276,
 151265356,
 151268140,
 151269036,
 151265644,
 151265964]


In [101]: lis1=[ [ [[] * 2] ]*3 ] * 10

In [102]: [id(x) for x in lis1]    # all objects are same, changing one will change 
                                   # others as well
Out[102]: 
[151278188,
 151278188,
 151278188,
 151278188,
 151278188,
 151278188,
 151278188,
 151278188,
 151278188,
 151278188]
Run Code Online (Sandbox Code Playgroud)


Nic*_*ell 5

这是你正在做的事情的一个问题.

假设您正在创建一个数组,如下所示:

>>> l = [ [ [[] * 2] ]*3 ] * 10
>>> l
[[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]]]
Run Code Online (Sandbox Code Playgroud)

到目前为止似乎没问题.我们在数组中设置一些东西.

>>> l[0][0][0] = 2
>>> l
[[[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]]]
Run Code Online (Sandbox Code Playgroud)

哇!我们在其中设置了1个项目,但它改变了一切!怎么会这样?

好吧,看来我们有60个列表对象.但是,我们实际上有60个引用一个列表对象.改变一个,改变它们.

TL; DR:不要在列表列表中使用乘法运算符.