【问题标题】:Python list of numpy matrices behaving strangelynumpy 矩阵的 Python 列表行为异常
【发布时间】:2013-02-09 09:18:27
【问题描述】:

我正在尝试使用 numpy 矩阵列表,但遇到了一个烦人的问题。

假设我从一个包含 10 个 2x2 零矩阵的列表开始

para=[numpy.matrix(numpy.zeros((2,2)))]*(10)

我像这样访问单个矩阵

para[0]
para[1]

等等。到目前为止一切顺利。

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

para[1][0]=numpy.matrix([[1,1]])

第一个索引指向列表中的第二个矩阵,第二个索引指向该矩阵中的第一行,将其替换为 [1,1]。

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

【问题讨论】:

    标签: python arrays list matrix numpy


    【解决方案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),请写 para = numpy.zeros((10, 2, 2))。然后分配看起来像:para[0,1,:] = numpy.matrix([1, 1]).
    • 是的,我以最一般的方式回答了这个问题,而不是特定于 numpy,因为如果您将任何包含可变对象的列表相乘,就会发生这种情况。不仅仅是 numpy 数组。
    猜你喜欢
    • 2021-10-05
    • 2015-06-25
    • 2017-05-17
    • 2016-07-31
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2018-02-16
    • 2021-11-08
    相关资源
    最近更新 更多