

python2.7を使用しています。  
今、下記のコードを実行し、

[code]

    print r.data
    print r[0][action-1].data
    
[/code]

> [[ 0.34642464 0.39359313 -1.24270797 -0.89923799 0.11451679 -0.49929592]]  
>  -0.499295920134

と結果がでました。そこで、

[code]

    r[0][action-1].data = 1
    
[/code]

と代入を行っても

[code]

    print r[0][action-1].data
    
[/code]

> -0.499295920134

代入が反映されません。何が問題なのでしょうか。  
よろしくお願いします。  
インポートパッケージは以下です。

[code]

    import numpy as np　　　　　　　　
    import matplotlib.pyplot as plt
    import cv2
    import random
    import chainer
    from chainer import cuda
    from chainer import serializers
    import chainer.functions as F
    from chainer import optimizers
    
[/code]

また、`print(type(r))`を入力すると、

> class 'chainer.variable.Variable'

とでます。`print r.dtype`結果は

> float32

です。 よろしくお願いします。


CC BY-SA 3.0
2017-09-06T06:05:11.143
37752
2017-10-30T07:25:15.443
2017-09-26T02:29:44.163
2383
25238
question
python chainer
Python　配列への代入


`r[0]` とすると
<https://github.com/chainer/chainer/blob/master/chainer/functions/array/get_item.py#L67>
が呼び出されます。  
[GetItem](https://github.com/chainer/chainer/blob/master/chainer/functions/array/get_item.py#L11)というFunctionNodeが作られて、その`apply`メソッドを`r`を引数にして呼んだものが返ってきます。  
つまり、スライスという操作をする計算ノードを作って適用した結果を返せ、という操作なので元のVariableが持っている`data`を共有していないのです。

書き換えたいなら

[code]

    r.data[0][1]=0.0
    
[/code]

でしょう。  
CPUで実行している分には書き換わっています。GPUの場合(つまりdataが`cupy.ndarray`の場合)は分かりません。

* * *

ちょっと試してみた、という話でないなら「なぜそれをしたいのか?」という内容をChainerのコミュニティにあげたほうがいいかと思いました。


CC BY-SA 3.0
2017-09-25T23:56:28.087
38186
2017-09-25T23:56:28.087
12274
37752
answer