样本A
:
In [231]: A = np.array([1,0,3,2,2,4]).reshape(2,3)
In [232]: A
Out[232]:
array([[1, 0, 3],
[2, 2, 4]])
您的代码和B
:
In [233]: B = np.zeros((A.shape[0],A.shape[1],1+np.amax(A)))
...: for i in range(A.shape[0]):
...: for j in range(A.shape[1]):
...: B[i,j,A[i,j]] = 1
...:
In [234]: B
Out[234]:
array([[[0., 1., 0., 0., 0.],
[1., 0., 0., 0., 0.],
[0., 0., 0., 1., 0.]],
[[0., 0., 1., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1.]]])
将数组定义为索引B
,以广播A
的方式:
In [235]: I,J=np.ix_(np.arange(2),np.arange(3))
In [236]: B[I,J,A]
Out[236]:
array([[1., 1., 1.],
[1., 1., 1.]])
使用该索引将B
的所有1更改为20:
In [237]: B[I,J,A]=20
In [238]: B
Out[238]:
array([[[ 0., 20., 0., 0., 0.],
[20., 0., 0., 0., 0.],
[ 0., 0., 0., 20., 0.]],
[[ 0., 0., 20., 0., 0.],
[ 0., 0., 20., 0., 0.],
[ 0., 0., 0., 0., 20.]]])
索引(2,1)和(1,3)与(2,3)配对:
In [239]: I,J
Out[239]:
(array([[0],
[1]]),
array([[0, 1, 2]]))
还有两个较新的函数可以做同样的事情.我更熟悉以前的方法
In [241]: np.take_along_axis(B,A[:,:,None],2)
Out[241]:
array([[[20.],
[20.],
[20.]],
[[20.],
[20.],
[20.]]])
In [243]: np.put_along_axis(B,A[:,:,None],1,axis=2)
In [244]: B
Out[244]:
array([[[0., 1., 0., 0., 0.],
[1., 0., 0., 0., 0.],
[0., 0., 0., 1., 0.]],
[[0., 0., 1., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1.]]])