、私は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
を変更すると、ll
とx
が変更されます。ディープコピーではなく、浅いリストのコピー(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
です。これはリスト構造を保存し、値をすべてコピーします。
リストのリストがあり、内部リストの少なくとも1つの要素は、浮動小数点数のnumpy配列です。私はあなたがなぜ[[] 'を繰り返しているのか、' [0,0] 'のようなものを使っていないのか疑問に思いました。 'random.sample'が何を作り出しているのか知っていますか?私の推測はネストされたリストのカップルです。そして 'np.copy'コピーとは何ですか?リスト?、配列?または、他の何か?なぜすべての入れ子ですか? – hpaulj
実際には3レベルのリストネストです。 'random.sample'はそのネストを保持します。しかし、 'np.copy'はそれを配列にラップして、オブジェクトdtype配列の中間レベルがない限り、4d配列を生成します。 – hpaulj
実際の 'population_list'、あるいは少なくとも同じように動作するより小さなバージョンを見る必要があります。 'np.copy'について不平を言う前に、私たちは入力を理解する必要があります。 'random.sample'の部分はおそらく関係ありません。リストで動作しているからです。 – hpaulj