4

アレイが1つあるとしましょう

    a = numpy.arange(8*6*3).reshape((8, 6, 3))
    #and another:
    l = numpy.array([[0,0],[0,1],[1,1]]) #an array of indexes to array "a"
    #and yet another:
    b = numpy.array([[0,0,5],[0,1,0],[1,1,3]])

ここで、「l」と「b」は同じ長さであり、言いたい

    a[l] = b

a [0] [0]が[0,0,5]になり、a[0][1]が[0,1,0]になるようになります。

iveが1次元配列を取得した場合は正常に機能するようですが、エラーが発生します

    ValueError: array is not broadcastable to correct shape

3次元配列で試してみると。

4

2 に答える 2

3
import numpy as np

a = np.arange(8*6*3).reshape((8, 6, 3))
l = np.array([[0,0],[0,1],[1,1]]) #an array of indexes to array "a"
b = np.array([[0,0,5],[0,1,0],[1,1,3]])

a[tuple(l.T)] = b
print(a[0,0])
# [0 0 5]

print(a[0,1])
# [0 1 0]

print(a[1,1])
# [1 1 3]

アン・アーチボルドは言う

すべてのインデックススロットに配列を提供する場合、返されるものは、配置した配列と同じ形状になります。したがって、次のような1次元リストを提供する場合

A [[1,2,3]、[1,4,5]、[7,6,2]]

あなたが得るものは

[A [1,1,7]、A [2,4,6]、A [3,5,2]]

それをあなたの例と比較すると、

a[l] = bNumPyに設定するように指示します

a[0,0,1] = [0,0,5]
a[0,1,1] = [0,1,0]

の3番目の要素はb未割り当てのままにします。これがエラーが発生する理由です

ValueError: array is not broadcastable to correct shape

l解決策は、配列を正しい形状に転置することです。

In [50]: tuple(l.T)
Out[50]: (array([0, 0, 1]), array([0, 1, 1]))

(を使用することもできますzip(*l)tuple(l.T)、少し高速です。)

于 2012-06-17T13:45:08.770 に答える
0

または、同じアレイで使用できます

for i in range(len(l)):
    a[l[i][0]][l[i][1]]=b[i]
于 2012-06-17T13:55:57.227 に答える