[英]Use of slicing numpy object in a list
我在使用numpy切片时遇到问题。 我什至不知道如何给这个问题起一个名字或标题。
以下是一段测试代码。
import numpy
input_items = []
output_items = []
input_items.insert(0, numpy.array([1, 2, 3], dtype=numpy.float32))
output_items.insert(0, numpy.array([0, 0, 0], dtype=numpy.float32))
in0 = input_items[0]
out = output_items[0]
print "Before, input_items[0] : {0}".format(input_items[0])
print "Before, output_items[0]: {0}".format(output_items[0])
out[:] = in0 * 2
#out = in0 * 2
print "After, input_item[0] : {0}".format(input_items[0])
print "After, output_item[0] : {0}".format(output_items[0])
如果我使用out[:] = in0 * 2
,我将得到:
Before, input_items[0] : [ 1. 2. 3.]
Before, output_items[0]: [ 0. 0. 0.]
After, input_items[0] : [ 1. 2. 3.]
After, output_items[0] : [ 2. 4. 6.]
如果使用out = in0 * 2
,我将得到:
Before, input_items[0] : [ 1. 2. 3.]
Before, output_items[0]: [ 0. 0. 0.]
After, input_items[0] : [ 1. 2. 3.]
After, output_items[0] : [ 0. 0. 0.]
在代码中,我已将output_items[0]
分配给out
,但是显然使用out
或out[:]
会影响output_items[0]
的结果。 有人能弄清楚吗?
谢谢。
out[:] = in0 * 2
更改原始数组,因为在numpy 切片中是原始数组的视图 (不是副本) ,因此您可以获取对其的引用并进行更改
out = in0 * 2
不会更改任何原始数组,因为您只是将计算结果分配给out
(结果存储在新的单独数组中),因此不是对output_items
或input_items
的引用
如果您需要复制一个数组,则可以使用numpy.copy()
,而不仅仅是分配out = output_items[0]
如果您没有复制就进行分配,则您仍在修改同一数组,这样更改将反映在其他地方(例如, out
和output_items[0]
因此,例如,如果执行out = output_items[0].copy()
,则out会从output_items[0]
的值复制一个新的新数组,但不会影响它
参考http://docs.scipy.org/doc/numpy/reference/generated/numpy.copy.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.