修改函数中的numpy数组?
问题描述:
我有下面的简单的程序中的问题:修改函数中的numpy数组?
def my_function(my_array = np.zeros(0)):
my_array = [1, 2, 3]
my_array = np.zeros(0)
my_function(my_array)
print my_array
仿佛my_array
传递通过拷贝而不是通过在函数内部参考它打印空数组。如何纠正?
答
np.zeros(0)
给你一个空numpy的阵列。现在函数中的引用现在指向一个新的Python列表,但是实际上并没有修改空的numpy数组,所以这仍然是您要打印的内容。
推荐阅读this answer来清除一些概念。
答
你可以在这里使用切片分配就像你的列表:
def func(my_array):
my_array[:3] = [1,2,3]
注意,这仍然需要在my_array
有至少3个元素...用法示例:
>>> def func(my_array):
... my_array[:3] = [1,2,3]
...
>>> a = np.zeros(4)
>>> a
array([ 0., 0., 0., 0.])
>>> func(a)
>>> a
array([ 1., 2., 3., 0.])
你缺少的东西是python如何处理引用。当您输入my_function
时,您可以参考绑定到名称my_array
的原始ndarray对象。但是,只要将分配给该名称的新内容,就会丢失原始引用并将其替换为对新对象(本例中为列表)的引用。
注意,具有默认参数,它是一个可变对象可以经常lead to surprises
答
传递引用模型更多地是指针的传值。所以在你的my_function中,你有一个指向你的原始my_array的指针的副本。如果您要使用该指针直接操作输入数组,但会进行更改,但是复制指针的重新分配不会影响原始数组。
作为一个例子:
def my_func(a):
a[1] = 2.0
ar = np.zeros(4)
my_func(ar)
print ar
上面的代码将改变AR的内部值。
对不起,我的错 – DonCallisto 2013-03-04 15:29:25
不用担心:) – YXD 2013-03-04 15:30:19
我不明白为什么当我打印数组里面的函数的时候效果不错,但不是外面的... – Vincent 2013-03-04 15:30:39