我最近找到了一个问题的解决方案,我觉得很奇怪,并希望更好地了解情况。该问题涉及在数组的指定索引处重写值。
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.]
我的印象是,在数组生成数组的精确副本后应用了[:]
。但似乎[:]
在这种情况下不能正常工作。
这里发生了什么?
答案 0 :(得分:3)
我的印象是,在数组生成数组的精确副本后应用了
[:]
。
那是错的。 [:]
应用于Python类型的实例,例如list
,str
,...将返回"浅"复制,但这并不意味着同样适用于NumPy数组。
事实上,当"基本切片"时,NumPy将始终返回views。用来。因为[:]
是基本切片,所以永远不会复制数组。请参阅documentation:
基本切片生成的所有数组始终是原始数组的视图。