在列表中使用切片numpy对象

时间:2014-10-11 23:11:16

标签: python numpy slice

使用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,但显然使用outout[:]会影响output_items[0]的结果。有人能想出来吗?

感谢。

1 个答案:

答案 0 :(得分:1)

说明

out[:] = in0 * 2更改原始数组,因为在原始数组(不是副本)中,numpy 切片是视图,所以你得到了一个参考并改变它

out = in0 * 2不会更改任何原始数组,因为您只是将计算结果分配给out(结果存储在一个全新的单独数组中),因此不会。 ta引用output_itemsinput_items

如果您需要复制数组,可以使用numpy.copy(),而不只是分配out = output_items[0] 如果您在没有副本的情况下进行分配,则仍在修改相同的数组,以便更改将反映在其他地方(例如outoutput_items[0]之间

所以,例如如果您执行out = output_items[0].copy(),现在已经从output_items[0]中的值复制了一个全新的数组,但却不会影响它

ref http://docs.scipy.org/doc/numpy/reference/generated/numpy.copy.html