4

私は 2 つの numpy 配列で、どちらも M × N です。X にはランダムな値が含まれています。Y には true/false が含まれます。配列 A には、置換が必要な X の行のインデックスが含まれており、値は -1 です。Y が true の値のみを置き換えたい。

これを行うコードは次のとおりです。

M=30
N=40
X = np.zeros((M,N))  # random values, but 0s work too
Y = np.where(np.random.rand(M,N) > .5, True, False)
A=np.array([ 7,  8, 10, 13]), # in my setting, it's (1,4), not (4,)
for i in A[0]:
    X[i][Y[A][i]==True]=-1

ただし、実際に必要なのは、一部のエントリのみを置き換えることです。リスト B には、A の各インデックスを置き換える必要がある数が含まれています。既に並べ替えられているため、A[0][0] は B[0] などに対応します。また、A[i] = k の場合、 Y の対応する行には、少なくとも k 個の true があります。

B = [1,2,1,1]

次に、各インデックス i について (ループ内で)、

X[i][Y[A][i]==True][0:B[i]] = -1

これはうまくいきません。修正に関するアイデアはありますか?

4

2 に答える 2

1

残念ながら、エレガントな答えはありません。ただし、これは機能します:

M=30
N=40
X = np.zeros((M,N))  # random values, but 0s work too
Y = np.where(np.random.rand(M,N) > .5, True, False)
A=np.array([ 7,  8, 10, 13]), # in my setting, it's (1,4), not (4,)
B = [1,2,1,1]

# position in row where X should equal - 1, i.e. X[7,a0], X[8,a1], etc
a0=np.where(Y[7]==True)[0][0]
a1=np.where(Y[8]==True)[0][0]
a2=np.where(Y[8]==True)[0][1]
a3=np.where(Y[10]==True)[0][0]
a4=np.where(Y[13]==True)[0][0]

# For each row (i) indexed by A, take only B[i] entries where Y[i]==True.  Assume these indices in X = -1
for i in range(len(A[0])):
    X[A[0][i]][(Y[A][i]==True).nonzero()[0][0:B[i]]]=-1

np.sum(X) # should be -5
X[7,a0]+X[8,a1]+X[8,a2]+X[10,a3]+X[13,a4] # should be -5
于 2013-09-08T13:51:09.903 に答える