2016-06-27 7 views
1

numpy.copyに問題があります。私は、テストの割り当て後population listをプリントアウトした場合Numpy.copyは無作為抽出のために意図されたとおりに動作しません

test = np.copy(random.sample(population_list, 2)) 
test[0][0][0][0] = 1.1111 

、それはで値を交換し、次のようにそれを使用して、それはまだ私が避けたい私の元のリストで背中の変化を、参照

その位置はpopulation_listで、1.1111です。私の目標は、最初のリストに影響を与えずに、リストからサンプルを抽出し、それらのサンプルを少し変更することです。

print(type(population_list)) 
print(type(population_list[0])) 
print(type(population_list[0][0])) 
print(type(population_list[0][0][0][0])) 

list 
list 
numpy.ndarray 
numpy.float64 

LE:This is how the data looks likeさらに情報として

、私のpopulation_listは、最初の要素がnumpyの行列であるリストのリスト、です。奇妙なフォーマットで申し訳ありませんが、クラスは私の脇にあります。私のコメントについては詳しく説明し

+0

リストのリストがあり、内部リストの少なくとも1つの要素は、浮動小数点数のnumpy配列です。私はあなたがなぜ[[] 'を繰り返しているのか、' [0,0] 'のようなものを使っていないのか疑問に思いました。 'random.sample'が何を作り出しているのか知っていますか?私の推測はネストされたリストのカップルです。そして 'np.copy'コピーとは何ですか?リスト?、配列?または、他の何か?なぜすべての入れ子ですか? – hpaulj

+0

実際には3レベルのリストネストです。 'random.sample'はそのネストを保持します。しかし、 'np.copy'はそれを配列にラップして、オブジェクトdtype配列の中間レベルがない限り、4d配列を生成します。 – hpaulj

+0

実際の 'population_list'、あるいは少なくとも同じように動作するより小さなバージョンを見る必要があります。 'np.copy'について不平を言う前に、私たちは入力を理解する必要があります。 'random.sample'の部分はおそらく関係ありません。リストで動作しているからです。 – hpaulj

答えて

3

、私はllは、異なるサイズのサブリストが含まれていた場合、我々はオブジェクト配列で遊ん

In [233]: ll.append([[2]]) 

In [234]: ll 
Out[234]: [[[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]], [[2]]] 

In [235]: random.sample(ll,2) 
Out[235]: [[[2]], [[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]]] 

In [236]: np.copy(ll) 
Out[236]: 
array([[[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]], 

     [[2]]], dtype=object) # (2,1,1) shape 

を得るでしょう

In [202]: x=np.arange(10.) 

In [223]: x 
Out[223]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

In [224]: ll=[[[x]]] # a list 

In [225]: ll[0] # still a list 
Out[225]: [[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]] 

In [226]: ll[0][0] # still a list 
Out[226]: [array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])] 

In [227]: ll[0][0][0] # an array 
Out[227]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

In [228]: ll[0][0][0][0] # a float 
Out[228]: 0.0 

In [229]: random.sample(ll,1) # same list nesting 
Out[229]: [[[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]]] 

In [230]: y=np.copy(ll) # a 4d array 

In [231]: y 
Out[231]: array([[[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]]]) 

In [232]: y.shape 
Out[232]: (1, 1, 1, 10) 

あなたのリストを再作成してみましょうこれはもう少しです。 np.copyが4d配列の場合、その要素を変更してもllまたはxは変更されません。しかし、中間オブジェクト配列レベルがある場合、yを変更すると、llxが変更されます。ディープコピーではなく、浅いリストのコピー(ll[:])を作成するようなものです。

In [270]: ll=[[[x]],[[1,2,3]]] 

In [271]: ll 
Out[271]: [[[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]], [[1, 2, 3]]] 

In [272]: y=np.copy(ll) 

In [273]: y 
Out[273]: 
array([[[array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]], 
     [[1, 2, 3]]], dtype=object) 

In [274]: y[0][0][0][0]=1 

In [275]: y 
Out[275]: 
array([[[array([ 1., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]], 
     [[1, 2, 3]]], dtype=object) 

In [276]: ll 
Out[276]: [[[array([ 1., 1., 2., 3., 4., 5., 6., 7., 8., 9.])]], [[1, 2, 3]]] 

In [277]: x 
Out[277]: array([ 1., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

つまり、np.copyは、ネストされたリストのリストの構造を保持しません。代わりに配列を作成しようとします。 あなたが使用すべきものはcopy.deepcopyです。これはリスト構造を保存し、値をすべてコピーします。

+0

この非常に詳細な回答をいただきありがとうございます。それは私が通常このようなものに費やすよりも早く理にかなっていました。 将来誰かがここで遭遇した場合は、http:// stackoverflowも参照してください。com/questions/184710/what-is-the-difference-deep-copy-and-a-shallow-copy @ hpauljの返事を補完するのに非常に役立った –

関連する問題