2

numpy配列の値を置き換えようとして、誰かが説明してくれることを望んでいた非常に奇妙な動作にぶつかるのにひどい時間を過ごしています。基本的に、遺伝的アルゴリズムで乗換え操作を行いたいと思います。これが簡単な例です。2 X 10の配列があり、行1から列5までのすべての値を、行2から列5までの値と交換する必要があります。コードは次のとおりです。

z=np.random.uniform(low=0,high=1,size=(2,10))
zcopy = z
print z

[[ 0.77488523  0.39966358  0.63233664  0.77093136  0.04102615  0.98984184
0.43402537  0.0910648   0.28037032  0.76654885]
[ 0.49980878  0.28161905  0.71972029  0.01208004  0.87851569  0.16853681
0.96325992  0.90886083  0.12344231  0.83665396]]

z[1,range(4)] = zcopy[0,range(4)]
print z

[[ 0.77488523  0.39966358  0.63233664  0.77093136  0.04102615  0.98984184
0.43402537  0.0910648   0.28037032  0.76654885]
[ 0.77488523  0.39966358  0.63233664  0.77093136  0.87851569  0.16853681
0.96325992  0.90886083  0.12344231  0.83665396]]

ご覧のとおり、行1のすべてが両方の行にコピーされています。しかし、別の配列のサブセットを指定せず、整数と言うだけで完全に機能する場合

z[1,range(4)] = range(4)
print z
[[ 0.77488523  0.39966358  0.63233664  0.77093136  0.04102615  0.98984184
0.43402537  0.0910648   0.28037032  0.76654885]
[ 0.          1.          2.          3.          0.87851569  0.16853681
0.96325992  0.90886083  0.12344231  0.83665396]]

私はかなり困惑しています。誰かがこれを回避する方法を知っていますか?

4

2 に答える 2

2

ここには2つの質問があるようです。

  1. zcopy = z「なんでコピーしないの?」
  2. z[1,range(4)] = zcopy[0,range(4)]「最初の 4 列の値を交換しないのはなぜですか?」

最初の質問に対する答えは、Python で変数名に値を代入してもコピーは作成されないということです。Python の変数は、オブジェクトの単なるラベルです。オブジェクトに新しいラベルを付けても、オブジェクト自体はまったく変更されません。copynumpy 配列のコピーを作成する場合、具体的には、配列の新しいコピーを返す メソッドを使用できます。次のように:

zcopy = z.copy()

2 番目の質問に対する答えは、コードが 1 つの値のセットのみを割り当てるということです: z[1, range(4)]. 両方の行を変更したい場合は、両方の行に割り当てる必要があります! 多くの言語ではtmp変数を使ってこれを行いますが、python は一時変数を必要とせずに値を交換する洗練された方法を提供します:

>>> z[1, range(4)], z[0, range(4)] = z[0, range(4)], z[1, range(4)]

nye17の答えは少しきれいですが、同じことをします。

于 2012-07-05T21:30:05.257 に答える
2

これを試して

z=np.random.uniform(low=0,high=1,size=(2,10))
z[:,range(4)] = z[::-1,range(4)]

[[ 0.30778241  0.04832341  0.616925    0.81325565  0.44578265  0.59024722 0.32147695  0.68434105  0.47430297  0.06256859]
 [ 0.58522801  0.23922353  0.15388696  0.46400394  0.33126422  0.54651948 0.34724277  0.46974174  0.68646707  0.62549495]]

[[ 0.58522801  0.23922353  0.15388696  0.46400394  0.44578265  0.59024722 0.32147695  0.68434105  0.47430297  0.06256859]
 [ 0.30778241  0.04832341  0.616925    0.81325565  0.33126422  0.54651948 0.34724277  0.46974174  0.68646707  0.62549495]]
于 2012-07-05T21:33:09.967 に答える