Python numpy.matrix忽略复制

Python numpy.matrix忽略复制,python,pandas,numpy,Python,Pandas,Numpy,我在熊猫数据框中有一列,它本身包含numpy数组(我知道,这可能不是最好的主意,但我现在很好奇)。对该列的副本调用numpy.matrix,会更改原始数据帧: import numpy as np import pandas as pd array = [np.array([1, 2])] df = pd.DataFrame({ 'arrays': array.copy() # creating a copy here... }) df_backup = df.copy(deep=

我在熊猫数据框中有一列,它本身包含numpy数组(我知道,这可能不是最好的主意,但我现在很好奇)。对该列的副本调用
numpy.matrix
,会更改原始数据帧:

import numpy as np
import pandas as pd

array = [np.array([1, 2])]

df = pd.DataFrame({
    'arrays': array.copy()  # creating a copy here...
})
df_backup = df.copy(deep=True)  # ... and here
df
这返回了我所期望的:

   arrays
0  [1, 2]
以下几点可供以后比较:

>>> array
[array([1, 2])]
>>> array[0].shape
(2,)
现在我试着把它转换成矩阵。它没有做我想让它做的事情,但我的观点是,它在不应该做的地方更改数据,据我所知:

>>> np.matrix(df.arrays.copy(), copy=True)  # another copy
matrix([[array([[1],
       [2]])]], dtype=object)
这就是事情变得奇怪的地方:

>>> df
       arrays
0  [[1], [2]]
所以我的单元格现在保存了一个数组,其中每个元素都是一个只有一个数字的数组,而以前它是一个只有两个数字的数组。尽管我告诉了
np.matrix(…,copy=True)
并制作了我的pandas系列的副本:
df.arrays.copy()
,但还是发生了这种情况

甚至我早些时候做的备份也发生了变化。我甚至用了深拷贝

这是最让我困惑的部分:我原来的名单也被改变了。(也在上面调用了
.copy()

所以现在我的问题是,在所有这些拷贝之后,所有的东西是如何联系在一起的?我还需要做些什么才能真正不改变原始数据

编辑:

因此,答案似乎是pandas只存储对numpy对象的引用,即使在

from copy import deepcopy
df_backup = deepcopy(df)
df_备份
仍会被修改

array
不被修改的唯一方法是执行以下操作

array_backup = deepcopy(array)

开始时。

首先,一个包含数组的列表:

In [334]: alist = [np.array([1,2])]
该列表中的数据帧:

In [335]: df = pd.DataFrame({'arrays':alist})
In [336]: df
Out[336]: 
   arrays
0  [1, 2]
pd
系列

In [337]: df.arrays
Out[337]: 
0    [1, 2]
Name: arrays, dtype: object
In [338]: df.arrays[0]
Out[338]: array([1, 2])
In [343]: mat2 = np.matrix(df.arrays)
In [344]: mat2
Out[344]: 
matrix([[array([[1],
       [2]])]], dtype=object)
In [345]: alist
Out[345]: 
[array([[1],
        [2]])]
In [346]: mat2.shape
Out[346]: (1, 1)
系列的一个元素

In [337]: df.arrays
Out[337]: 
0    [1, 2]
Name: arrays, dtype: object
In [338]: df.arrays[0]
Out[338]: array([1, 2])
In [343]: mat2 = np.matrix(df.arrays)
In [344]: mat2
Out[344]: 
matrix([[array([[1],
       [2]])]], dtype=object)
In [345]: alist
Out[345]: 
[array([[1],
        [2]])]
In [346]: mat2.shape
Out[346]: (1, 1)
从该数组生成一个矩阵-它是一个副本(默认参数)

系列中创建矩阵

In [337]: df.arrays
Out[337]: 
0    [1, 2]
Name: arrays, dtype: object
In [338]: df.arrays[0]
Out[338]: array([1, 2])
In [343]: mat2 = np.matrix(df.arrays)
In [344]: mat2
Out[344]: 
matrix([[array([[1],
       [2]])]], dtype=object)
In [345]: alist
Out[345]: 
[array([[1],
        [2]])]
In [346]: mat2.shape
Out[346]: (1, 1)
mat2
是一个(1,1)矩阵(矩阵总是2d),对象数据类型-也就是说,它包含一个对象,在本例中是一个数组

创建
mat2
已将
alist
中的元素替换为(2,1)数组
df
还有一个指向这个新数组的指针。(编辑-进一步挖掘创建
mat2
似乎只是在
alist
中重塑了数组)


我不确定是什么创建了这个(2,1)数组,但我怀疑它与
系列
如何将其元素传递给
np.matrix
有关。在任何情况下,您都不希望直接从
系列
生成矩阵。您可以从该系列的一个元素创建它。

array
是一个列表
array.copy()
只是一个新列表,但指针相同。与
数组[:]
相同。它不是深度副本或包含数组的副本。