【问题标题】:How do I create a numpy N-dimensional array of zeros, with only a single element equal to one?如何创建一个 numpy N 维零数组,只有一个元素等于 1?
【发布时间】:2020-07-05 00:22:33
【问题描述】:

是否有一种简短的单行方法来创建 numpy 数组(可能有多个维度),该数组在某个位置有一个,而在所有其他位置都为零?对于一维数组,可以执行以下操作来创建一个在 k^{th} 位置上具有 1 的数组:

np.eye(1, N, k = k)

如何将其推广到更高维的情况?

【问题讨论】:

  • 那么如果数组不是一维数组,那么 os 在哪里, 0 在哪里?是每个最后一维数组的第一个位置的第一个位置唯一的。请举例
  • ...“可爱”的方式?
  • @azro 类似这样: np.array([[0, 0, 1], [0, 0, 0]]) - 唯一的一个非零元素位于 [0, 2] .一般来说,如果数组是 N 维的,除了一些 [i_1, i_2, \ldots, i_n] 之外的所有位置都为零,并且在这个位置有 1。

标签: python arrays numpy


【解决方案1】:

例如,如果您需要一个索引为 (2, 3) 的 1 的 3x5 矩阵,只需创建一个一维数组,然后对其进行整形:

M, N = 3, 5
i, j = 2, 3
np.eye(1, M * N, k=(i+1) * M + j).reshape(M, N)

array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0.]])

了解 每个 多维 numpy 数组在内部表示为一维数组可能会有所帮助,并带有一些包装逻辑来处理步幅和索引。这意味着这里的解决方案也可以通过适当的算术推广到任何维度。这是一个概括:

def make_nd_array_with(dims, index):
    return (np.eye(1, 
                   np.prod(dims), 
                   k=(((np.array(index[:-1]) + 1) * dims[:-1]).sum() + index[-1]))
              .reshape(*dims))

make_nd_array_with((M,N), (i,j))

array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0.]])

请注意,这解决了您希望在一行中执行此操作的限制,但通常规范的解决方案是创建一个零数组并设置单个值,正如 cmets 和 other answer 提到的那样。

arr = np.zeros(M, N)
arr[i, j] = 1

【讨论】:

  • 请注意,这假定计算索引的行主要顺序。
【解决方案2】:

与使用eyereshape 相比,只需编写一个调用zeros 并设置所需元素的函数要清楚得多

def mostly_zeros(shape, nonzero_position, dtype=float, nonzero_element=1):
    retval = numpy.zeros(shape, dtype=dtype)
    retval[nonzero_index] = nonzero_element
    return retval

然后你可以调用mostly_zeros(shape=(4, 5), nonzero_position=(2, 2)) 来获得一个形状几乎为零的数组(4, 5)1.0 在位置(2, 2)。与eye 相比,这将少很多令人头疼的维护问题。


或者,您可以编写一个设置项目并返回数组的函数:

def chainable_setitem(obj, index, val):
    obj[index] = val
    return obj

然后您可以通过chainable_setitem(numpy.zeros((4, 5)), (2, 2), 1) 获得一个 4x5 数组,其中位置 2、2 为 1.0,其他位置为零。

【讨论】:

  • 这显然是规范的答案,操作添加了一个约束以在我的答案地址的单行中执行此操作。但这是正确的答案。
【解决方案3】:

既然您要求单线:

np.bincount([np.ravel_multi_index(pos,shp)],None,np.prod(shp)).reshape(shp)

例子

shp = 3,4
pos = 1,2
np.bincount([np.ravel_multi_index(pos,shp)],None,np.prod(shp)).reshape(shp)
# array([[0, 0, 0, 0],
#        [0, 0, 1, 0],
#        [0, 0, 0, 0]])

诚然,这对于简化为的一维来说要好得多

np.bincount([pos],None,length)

比nD

【讨论】:

  • 对于一维案例,使用np.eye 看起来更好:np.eye(<N>)[<pos>]
猜你喜欢
  • 2021-12-20
  • 2012-10-04
  • 2019-12-16
  • 1970-01-01
  • 2021-06-11
  • 2021-01-09
  • 1970-01-01
相关资源
最近更新 更多