修改函数中的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来清除一些概念。

+0

对不起,我的错 – DonCallisto 2013-03-04 15:29:25

+0

不用担心:) – YXD 2013-03-04 15:30:19

+0

我不明白为什么当我打印数组里面的函数的时候效果不错,但不是外面的... – Vincent 2013-03-04 15:30:39

你可以在这里使用切片分配就像你的列表:

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

+0

我不知道是否有一个简洁的方式来避免':3'。如果输入数组有10个元素,那么这个代码就不会做我怀疑OP会从他的代码中期望的东西。 – NPE 2013-03-04 15:26:40

+1

这实际上并不奏效 - 试试'a = np.zeros(0)' 和'a [:3] = [1,2,3]' – YXD 2013-03-04 15:28:15

+0

@MrE - 当然。我想我假设OP实际上会通过一个足够大的参数来处理计算中的RHS。 – mgilson 2013-03-04 15:29:36

传递引用模型更多地是指针的传值。所以在你的my_function中,你有一个指向你的原始my_array的指针的副本。如果您要使用该指针直接操作输入数组,但会进行更改,但是复制指针的重新分配不会影响原始数组。

作为一个例子:

def my_func(a): 
    a[1] = 2.0 

ar = np.zeros(4) 
my_func(ar) 
print ar 

上面的代码将改变AR的内部值。