有没有一种纯NumPy的方法来创建一个ND标识符和值的数组?

thigvfpy  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(73)

此脚本创建一个数组b的索引和给定数组a的值,这在例如将2.5D高度图转换为点云时很有用:

import numpy as np

a = np.arange(12).reshape(3, 4)
b = np.array([[*i, val] for i, val in np.ndenumerate(a)])
print(b)

个字符
有没有一种纯NumPy的方式,即没有循环,来做同样的事情?

kjthegm6

kjthegm61#

许多可能的方法之一:

In [129]: np.hstack((np.argwhere(np.ones((3,4))),np.arange(12)[:,None]))
Out[129]: 
array([[ 0,  0,  0],
       [ 0,  1,  1],
       [ 0,  2,  2],
       [ 0,  3,  3],
       [ 1,  0,  4],
       [ 1,  1,  5],
       [ 1,  2,  6],
       [ 1,  3,  7],
       [ 2,  0,  8],
       [ 2,  1,  9],
       [ 2,  2, 10],
       [ 2,  3, 11]], dtype=int64)

字符串
另一个:

In [144]: arr = np.concatenate((np.mgrid[:3,:4],np.arange(12).reshape(1,3,4)))

In [145]: arr
Out[145]: 
array([[[ 0,  0,  0,  0],
        [ 1,  1,  1,  1],
        [ 2,  2,  2,  2]],

       [[ 0,  1,  2,  3],
        [ 0,  1,  2,  3],
        [ 0,  1,  2,  3]],

       [[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]]])

In [146]: arr.reshape(3,-1).T
Out[146]: 
array([[ 0,  0,  0],
       [ 0,  1,  1],
       [ 0,  2,  2],
       [ 0,  3,  3],
       [ 1,  0,  4],
       [ 1,  1,  5],
       [ 1,  2,  6],
       [ 1,  3,  7],
       [ 2,  0,  8],
       [ 2,  1,  9],
       [ 2,  2, 10],
       [ 2,  3, 11]])

w41d8nur

w41d8nur2#

我会说

b = np.column_stack((
    np.indices(a.shape).reshape(a.ndim, -1).T,
    a.ravel()
))

字符串
np.indices通常用于生成一个包含所有可能索引的数组。在这里,它只是被转置和整形,以形成b中除了最后一列之外的所有列。
np.column_stack似乎是最自然的,最终将索引连接到松散的a
以上应该适用于任何维度a

相关问题