Numpy.copy无法按随机采样的方式工作

时间:2016-06-27 01:18:51

标签: python numpy matrix

我遇到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。对于奇怪的格式感到抱歉,目前课程已超出我的范围。

1 个答案:

答案 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数组,则修改其元素不会修改llx。但是,如果存在中间对象数组级别,则修改y将修改llx。它更像是制作浅层列表副本(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 。这样可以保留列表结构,并将值一直复制下来。