创建空矩阵Python

2024-04-25 21:10:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我第一次想到这个,但这不管用:

parameters = [ [ [] * 2 ]*3 ] * 10

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

[[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []], 
[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []]]

也就是说,如果我想访问参数[0][0][1],我就越界了,而我想为第三个维度上最里面的向量设置一个维度2。

然后我想到了这个

[ [ [[] * 2] ]*3 ] * 10

我想[[] * 2]现在会给我带来我想要的东西,最里面的两个元素向量。我得到

[[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], 
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], 
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]]]

那么,怎么做呢,或者怎么逃逸这个初始化呢?

Kd rgds公司。


Tags: 元素参数公司数组向量kdparameters越界
3条回答

我建议你用纽比做这种东西。它使访问列或行更加容易。对于你的用例

import numpy as np

matrix = np.zeros((2,3,10))
second_col = matrix[:,1,:]

Numpy也会更好地处理你的数据,它用Fortran或C语言实现了很多矩阵代数,所以在(可能的)将来,当你做矩阵乘法之类的事情时,它会更快。

首先,您应该在最里面的列表中插入一些内容(比如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]]]

因此,您应该使用列表理解:

>> parameters=[[[None for i in range(2)] for j in range(3)] for k in range(10)]

但是,我建议使用numpy作为其他答案之一。

我想这样做,使用创建的列表是不同的对象(即不同的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]

相关问题 更多 >