0

...コードを直接表示することをお勧めします。ここにあります:

import numpy as np
a = np.zeros([3, 3])
a
array([[ 0., 0., 0.],
       [ 0., 0., 0.],
       [ 0., 0., 0.]])
b = np.random.random_integers(0, 100, size = (1, 3))
b
array([[ 10,  3,  8]])
c = np.random.random_integers(0, 100, size = (4, 3))
c
array([[ 22, 21, 14],
       [ 55, 64, 12],
       [ 33, 85, 98],
       [ 37, 44, 45]])
a = b  will change dimensions of a
a = c  will change dimensions of a

a = b の場合、次のものが必要です。

array([[ 10.,  3.,  8.],
       [  0.,  0.,  0.],
       [  0.,  0.,  0.]])

そしてa = cの場合、私は欲しい:

array([[ 22, 21, 14],
       [ 55, 64, 12],
       [ 33, 85, 98]])

したがって、「a」の形状をロックして、必要に応じて割り当てられている値が「トリミング」されるようにしたいと考えています。もちろん if 文なしで。

4

2 に答える 2

1

Numpy スライス表記を使用すると、これを簡単に行うことができます。これは、それを明確に説明する良い答えのあるSOの質問です。基本的に、左側の配列と右側の配列の形状が一致していることを確認する必要があります。これは、対応する配列を適切にスライスすることで実現できます。

import numpy as np
a = np.zeros([3, 3])
b = np.array([[ 10,  3,  8]])
c = np.array([[ 22, 21, 14],
       [ 55, 64, 12],
       [ 33, 85, 98],
       [ 37, 44, 45]])

a[0] = b
print a
a = c[0:3]
print a

出力:

[[ 10.   3.   8.]
 [  0.   0.   0.]
 [  0.   0.   0.]]
[[22 21 14]
 [55 64 12]
 [33 85 98]]

配列のサイズを気にせずに、2D 配列の左上の要素を 2 番目の 2D 配列の要素に置き換えたいようです。ここに方法があります:

def replacer(orig, repl):
    new = np.copy(orig)
    w2, h1 = new.shape
    w1, h2 = repl.shape
    new[0:min(w1,w2), 0:min(h1,h2)] = repl[0:min(w1,w2), 0:min(h1,h2)]
    return new
print replacer(a,b)
print replacer(a,c)
于 2013-01-19T19:40:19.027 に答える
1

問題は、等号演算子が配列の浅いコピーを作成していて、必要なのは配列の一部の深いコピーであることです。

したがって、b が外部配列を 1 つしか持たないことがわかっている場合は、次のように実行できます。

a[0] = b

a が 3x3 であることがわかっている場合は、次のようにすることもできます。

a = c[0:3]

さらに、それらを実際のディープコピーにしたい場合は、次のことが必要になります。

a[0] = b.copy()

a = c[0:3].copy()

それらを独立させるために。

行列の長さがわからない場合は、len()関数を使用して実行時に調べることができます。

于 2013-01-19T19:41:14.273 に答える