【发布时间】:2013-03-04 16:26:38
【问题描述】:
如何在一个函数内连接两个 numpy 数组并考虑以下程序返回它
#!/usr/bin/env python
import numpy as np
def myfunction(myarray = np.zeros(0)):
print "myfunction : before = ", myarray # This line should not be modified
data = np.loadtxt("test.txt", unpack=True) # This line should not be modified
myarray = np.concatenate((myarray, data))
print "myfunction : after = ", myarray # This line should not be modified
return # This line should not be modified
myarray = np.array([1, 2, 3])
print "main : before = ", myarray
myfunction(myarray)
print "main : after = ", myarray
这段代码的结果是:
main : before = [1 2 3]
myfunction : before = [1 2 3]
myfunction : after = [ 1. 2. 3. 1. 2. 3. 4. 5.]
main : after = [1 2 3]
我想要:
main : before = [1 2 3]
myfunction : before = [1 2 3]
myfunction : after = [ 1. 2. 3. 1. 2. 3. 4. 5.]
main : after = [ 1. 2. 3. 1. 2. 3. 4. 5.]
如何修改提供的程序以获得预期的结果(# This line should not be modified标记的4行应该保持不变)?
【问题讨论】:
-
文森特,我不相信你所要求的在这里是完全可能的。您可以将列表传递给函数,添加元素,并且将修改传入的原始列表。但是,numpy 数组不能像列表那样增长或缩小。 concatenate 函数创建了一个全新的对象,这就是为什么原始对象 array([1,2,3]) 没有改变的原因。正如 Dave 所说,您必须返回新的数组串联数组对象才能使用它。
-
我还不相信这是不可能的。但是,即使可以就地修改
myarray,您当然也不希望将其与具有默认值 (myarray = np.zeros(0)) 的它结合起来。 -
我认为您正在遭受XY problem 的痛苦。你有一个问题,你认为你知道一种可以解决它的方法,所以你问的是如何让你的方法发挥作用——即使它不能很好地适应 Python 的对象模型——而不是问如何解决您的问题。
标签: python arrays numpy pass-by-reference