处理numpy矩阵的副本

时间:2018-10-11 05:53:13

标签: python numpy

我正尝试如下操作矩阵的副本。

import numpy as np

A = np.matrix([[4, 1, -1, 1], [1, 4, -1, -1], [-1, -1, 5, 1], [1, -1, 1, 3]])

B = A

B[0, 0] = 0

这也会将A的00项也更改为0,但是我不希望发生这种情况。我也尝试过np.array(),但是同样的事情再次发生。我认为这是因为A和B指向内存中的同一位置。

如果有人让我知道如何在B更改时阻止A更改,我将不胜感激。

5 个答案:

答案 0 :(得分:0)

您完全正确,AB指向您所用的相同内存分配。
numpy具有您想要实现的复制功能:

B = np.copy(A)

答案 1 :(得分:0)

当您执行B = A时,B只是对已经存在的数组A的引用。由于效率原因,NumPy不会直接复制。

因此,您应该使用arr.copy()复制数组的内容,如下所示:

In [9]: B = A.copy()                                                                                                                                                                                               

In [10]: A                                                                                                                                                                                                         
Out[10]: 
matrix([[ 4,  1, -1,  1],
        [ 1,  4, -1, -1],
        [-1, -1,  5,  1],
        [ 1, -1,  1,  3]])

# update an entry in array `B`
In [11]: B[0, 0] = 0                                                                                                                                                                                               

# A is unaffected
In [12]: A                                                                                                                                                                                                         
Out[12]: 
matrix([[ 4,  1, -1,  1],
        [ 1,  4, -1, -1],
        [-1, -1,  5,  1],
        [ 1, -1,  1,  3]])

# change happens only in array B
In [13]: B                                                                                                                                                                                                         
Out[13]: 
matrix([[ 0,  1, -1,  1],
        [ 1,  4, -1, -1],
        [-1, -1,  5,  1],
        [ 1, -1,  1,  3]])

答案 2 :(得分:0)

尝试一下:

  B[:] = A

这将进行深度复制

答案 3 :(得分:0)

您需要创建对象的副本。您可以使用numpy.copy进行此操作,因为您正在使用numpy对象。

因此,您的代码将如下所示:

B = np.copy(A)

python使用两种复制。

  

浅表副本会构造一个新的复合对象,然后(在可能的范围内)将对原始对象中的对象的引用插入其中。

     

深层副本会构造一个新的复合对象,然后递归地将原始对象中的对象的副本插入其中。

它们独立于对象类型工作。

from copy import copy, deepcopy

# Shallow copy
b= copy(a)

# Deep copy of object
b= deepcopy(a)

答案 4 :(得分:0)

您是正确的,现在您的B和A正在引用内存中的同一位置。对于您的问题,我建议

-vm
C:\Program Files\Java\jdk-10.0.1\bin\javaw.exe

在此处查看文档:{​​{3}}

这里有一个示例,其中包含您要查找的内容:

 numpy.matrix.copy