行为异常的numpy矩阵的Python列表

行为异常的numpy矩阵的Python列表,python,arrays,list,matrix,numpy,Python,Arrays,List,Matrix,Numpy,我试图处理numpy矩阵列表,但遇到了一个恼人的问题 假设我从十个2x2零矩阵的列表开始 para=[numpy.matrix(numpy.zeros((2,2)))]*(10) 我像这样访问单个矩阵 para[0] para[1] 等等。到目前为止还不错 现在,我只想修改第二个矩阵的第一行,其余的都保持不变。所以我这么做 para[1][0]=numpy.matrix([[1,1]]) 第一个索引指向列表中的第二个矩阵,第二个索引指向该矩阵中的第一行,并将其替换为[1,1] 但奇怪的是,

我试图处理numpy矩阵列表,但遇到了一个恼人的问题

假设我从十个2x2零矩阵的列表开始

para=[numpy.matrix(numpy.zeros((2,2)))]*(10)
我像这样访问单个矩阵

para[0]
para[1]
等等。到目前为止还不错

现在,我只想修改第二个矩阵的第一行,其余的都保持不变。所以我这么做

para[1][0]=numpy.matrix([[1,1]])
第一个索引指向列表中的第二个矩阵,第二个索引指向该矩阵中的第一行,并将其替换为[1,1]


但奇怪的是,这个命令将列表中所有十个矩阵的第一行更改为[1,1],而不是我想要的第二行。给出了什么?

当您将初始列表乘以10时,将得到一个包含10个numpy数组的列表,这些数组实际上引用了相同的底层结构。修改一个数组将修改所有数组,因为实际上只有一个numpy数组,而不是10个

如果您需要证据,请查看REPL中的示例:

>>> a = numpy.zeros(10)
>>> a = [numpy.zeros(10)]*10
>>> a[0] is a[1]
True
>>> 
is
操作符检查两个对象是否实际上相同(而不是它们的值是否相等)

您应该使用列表理解来生成初始数组,而不是乘法,如下所示:

para=[numpy.matrix(numpy.zeros((2,2))) for i in range(10)]

这将调用
numpy.matrix()
十次而不是一次,并生成10个不同的矩阵。

当您将初始列表乘以10时,您将得到一个包含10个numpy数组的列表,这些数组实际上引用了相同的底层结构。修改一个数组将修改所有数组,因为实际上只有一个numpy数组,而不是10个

如果您需要证据,请查看REPL中的示例:

>>> a = numpy.zeros(10)
>>> a = [numpy.zeros(10)]*10
>>> a[0] is a[1]
True
>>> 
is
操作符检查两个对象是否实际上相同(而不是它们的值是否相等)

您应该使用列表理解来生成初始数组,而不是乘法,如下所示:

para=[numpy.matrix(numpy.zeros((2,2))) for i in range(10)]

这将调用
numpy.matrix()
十次而不是一次,并生成10个不同的矩阵。

或者,如果矩阵的数量是固定的(例如10),则写入
para=numpy.zero((10,2,2))
。然后赋值将如下所示:
para[0,1,:]=numpy.matrix([1,1])
。好的,我以最一般的方式回答了这个问题,而不是numpy-specific,因为如果将任何包含可变对象的列表相乘,就会发生这种情况。不仅仅是numpy数组。或者,如果矩阵的数量是固定的(例如10),则写入
para=numpy.zero((10,2,2))
。然后赋值将如下所示:
para[0,1,:]=numpy.matrix([1,1])
。好的,我以最一般的方式回答了这个问题,而不是numpy-specific,因为如果将任何包含可变对象的列表相乘,就会发生这种情况。不仅仅是numpy阵列。