Numpy.复制不按随机抽样的要求工作

2024-09-29 23:24:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个问题,numpy.copy没有按预期工作。在

当按如下方式使用它时,它仍然引用我原来列表中的更改,我希望避免:

test = np.copy(random.sample(population_list, 2))
test[0][0][0][0] = 1.1111

如果我在测试赋值之后打印出population list,它会将population_list位置的值替换为1.1111。我的目标是从列表中抽取样本,然后对这些样本进行一些更改,而不影响初始列表。在

作为进一步的信息,mypopulation_list是一个列表列表,其中第一个元素是一个numpy矩阵:

^{pr2}$

乐:This is how the data looks like。很抱歉这种奇怪的形式,我现在无法上课。在


Tags: sampletestnumpy信息目标列表np方式
1条回答
网友
1楼 · 发布于 2024-09-29 23:24:36

为了详细说明我的意见,我会重新列出你的清单

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包含不同大小的子列表,我们将得到一个对象数组

^{pr2}$

再拿这个玩一玩。如果np.copy是4d数组,那么修改它的元素不会修改ll或{}。但是如果存在中间对象数组级别,那么修改y将修改ll和{}。它更像是制作浅表副本(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。这将保留列表结构,并将值一直复制到下一级。在

相关问题 更多 >

    热门问题