我遇到numpy.copy无法正常工作的问题。
当按照以下方式使用它时,它仍然引用我原始列表中的更改,我想避免:
test = np.copy(random.sample(population_list, 2))
test[0][0][0][0] = 1.1111
如果我在测试作业后打印出population list
,它会将population_list
的位置值替换为1.1111。我的目标是从列表中进行采样,然后对这些样本进行一些更改,而不会影响初始列表。
作为进一步的信息,我的population_list
是一个列表列表,其中第一个元素是一个numpy矩阵:
print(type(population_list))
print(type(population_list[0]))
print(type(population_list[0][0]))
print(type(population_list[0][0][0][0]))
list
list
numpy.ndarray
numpy.float64
LE:This is how the data looks like。对于奇怪的格式感到抱歉,目前课程已超出我的范围。
答案 0 :(得分:3)
要详细说明我的评论,我会尝试重新创建您的列表
In [202]: x=np.arange(10.)
In [223]: x
Out[223]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
In [224]: ll=[[[x]]] # a list
In [225]: ll[0] # still a list
Out[225]: [[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]]
In [226]: ll[0][0] # still a list
Out[226]: [array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]
In [227]: ll[0][0][0] # an array
Out[227]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
In [228]: ll[0][0][0][0] # a float
Out[228]: 0.0
In [229]: random.sample(ll,1) # same list nesting
Out[229]: [[[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]]]
In [230]: y=np.copy(ll) # a 4d array
In [231]: y
Out[231]: array([[[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]]])
In [232]: y.shape
Out[232]: (1, 1, 1, 10)
如果ll
包含不同大小的子列表,我们将获得一个对象数组
In [233]: ll.append([[2]])
In [234]: ll
Out[234]: [[[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]], [[2]]]
In [235]: random.sample(ll,2)
Out[235]: [[[2]], [[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]]]
In [236]: np.copy(ll)
Out[236]:
array([[[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]],
[[2]]], dtype=object) # (2,1,1) shape
再玩这个。如果np.copy
是4d数组,则修改其元素不会修改ll
或x
。但是,如果存在中间对象数组级别,则修改y
将修改ll
和x
。它更像是制作浅层列表副本(ll[:]
)而不是深层副本。
In [270]: ll=[[[x]],[[1,2,3]]]
In [271]: ll
Out[271]: [[[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]], [[1, 2, 3]]]
In [272]: y=np.copy(ll)
In [273]: y
Out[273]:
array([[[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]],
[[1, 2, 3]]], dtype=object)
In [274]: y[0][0][0][0]=1
In [275]: y
Out[275]:
array([[[array([ 1., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]],
[[1, 2, 3]]], dtype=object)
In [276]: ll
Out[276]: [[[array([ 1., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]], [[1, 2, 3]]]
In [277]: x
Out[277]: array([ 1., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
总之,np.copy
不保留嵌套列表列表的结构。它试图改造一个数组。 您应该使用的是copy.deepcopy
。这样可以保留列表结构,并将值一直复制下来。