有没有办法将N×M矩阵A转换成

  • A的所有值都是正整数

到NxMxL矩阵B,其中

  • L=1+max(A)
  • B[i,j,k]={1,如果k==A[i,j],否则为0}

使用循环,我已经完成了以下工作:

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

该解决方案理想地避免了任何for循环的使用,而只使用切片、索引或NumPy函数

推荐答案

样本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.]]])

Python相关问答推荐

如何将自动创建的代码转换为类而不是字符串?

我可以使用极点优化这个面向cpu的pandas代码吗?

Pydantic:如何将对象列表表示为dict(将列表序列化为dict)

如何通过多2多字段过滤查询集

LAB中的增强数组

TARete错误:类型对象任务没有属性模型'

滚动和,句号来自Pandas列

rame中不兼容的d类型

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

从numpy数组和参数创建收件箱

发生异常:TclMessage命令名称无效.!listbox"

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

python中字符串的条件替换

如何在UserSerializer中添加显式字段?

当点击tkinter菜单而不是菜单选项时,如何执行命令?

如何在Python中获取`Genericums`超级类型?

在matplotlib中删除子图之间的间隙_mosaic

如何在BeautifulSoup/CSS Select 器中处理regex?

在pandas/python中计数嵌套类别