2

関数内で2つの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.]

提供されたプログラムを変更して期待される結果を得るにはどうすればよいですか(でマークされた4行# This line should not be modifiedは同じままである必要があります)?

4

2 に答える 2

2

値を返す必要があります

次のように関数を変更します。

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
    concatenated = np.concatenate((myarray, data))
    print "myfunction : after = ", myarray     # This line should not be modified
    return  concatenated

そして、あなたはそのような結果を得る

result = myfunction(myarray)
于 2013-03-04T16:35:16.407 に答える
1

次のことを行うことができますが、非常にうまくいかない可能性があります。

def in_place_concatenate(arr1, arr2) :
    n = len(arr1)
    arr1.resize((n + len(arr2),), refcheck=False)
    arr1[n:] = arr2

そしてあなたが期待するように:

>>> a = np.arange(10)
>>> b = np.arange(4)
>>> in_place_concatenate(a, b)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3])

だが:

>>> a = np.arange(10)
>>> b = np.arange(4)
>>> c = a[:5]
>>> c
array([0, 1, 2, 3, 4])
>>> in_place_concatenate(a, b)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3])
>>> c
array([         1, 1731952544,   71064376,          1,   67293736])

また、データのいずれかを変更しようとするとc、セグメンテーション違反が発生します...

refcheck設定しなかった場合Falseは発生しませんが、関数内で変更を行うこともできません。そうです、それは可能ですが、すべきではありません。Entropieceの方法に従ってください。

于 2013-03-04T18:27:52.610 に答える