为什么数组[:]没有复制数组?

时间:2017-11-30 11:41:03

标签: python arrays numpy indexing copy

我最近找到了一个问题的解决方案,我觉得很奇怪,并希望更好地了解情况。该问题涉及在数组的指定索引处重写值。

import numpy as np

# create array to overwrite
mask = np.ones(10)

# first set of index-value pairs
idx_1 = [0, 3, 4]
val_1 = [100, 200, 300]

# second set of index-value pairs
idx_2 = [1, 5, 6]
val_2 = [250, 505, 650]

# third set of index-value pairs
idx_3 = [7, 8, 9]
val_3 = [900, 800, 700]

def overwrite_mask(mask, indices, values):
    """ This function overwrites elements in mask with values at indices. """
    mask[indices] = values
    return mask

# incorrect
# res_1 = overwrite_mask(mask[:], idx_1, val_1)
# res_2 = overwrite_mask(mask[:], idx_2, val_2)
# res_3 = overwrite_mask(mask[:], idx_3, val_3)
# >> [ 100.  250.    1.  200.  300.  505.  650.  900.  800.  700.]
# >> [ 100.  250.    1.  200.  300.  505.  650.  900.  800.  700.]
# >> [ 100.  250.    1.  200.  300.  505.  650.  900.  800.  700.]

# correct
res_1 = overwrite_mask(mask.copy(), idx_1, val_1)
res_2 = overwrite_mask(mask.copy(), idx_2, val_2)
res_3 = overwrite_mask(mask.copy(), idx_3, val_3)
# [ 100.    1.    1.  200.  300.    1.    1.    1.    1.    1.]
# [   1.  250.    1.    1.    1.  505.  650.    1.    1.    1.]
# [   1.    1.    1.    1.    1.    1.    1.  900.  800.  700.] 

我的印象是,在数组生成数组的精确副本后应用了[:]。但似乎[:]在这种情况下不能正常工作。

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

  

我的印象是,在数组生成数组的精确副本后应用了[:]

那是错的。 [:]应用于Python类型的实例,例如liststr,...将返回"浅"复制,但这并不意味着同样适用于NumPy数组。

事实上,当"基本切片"时,NumPy将始终返回views。用来。因为[:]是基本切片,所以永远不会复制数组。请参阅documentation

  

基本切片生成的所有数组始终是原始数组的视图。