首页 > 解决方案 > 是否有一种“numpy”方法将 1D Numpy 数组扩展到 2D,输出值取决于原始值?

问题描述

我有一个数字列表,称为“列表”,长度为 l,最大 N。所需的输出是一个形状为 [l, N] 的 numpy 数组,其中每一行都有 list[row_index] 1,其余为 0。

我已经用 for 循环完成了它,但我尽量不要将循环用于非顺序问题,因为 numpy 通常有一种很酷的方式来处理它。

例子:

Input: 
    N=5
    list = [3,
            2,
            4,
            2,
            1,
            0]

Desired Output:
    [[1, 1, 1, 0, 0],
     [1, 1, 0, 0, 0],
     [1, 1, 1, 1, 0],
     [1, 1, 0, 0, 0],
     [1, 0, 0, 0, 0],
     [0, 0, 0, 0, 0]]

我试过的方式:

for i in range(len(list)):
    list[i] = np.concatenate(np.ones(list[i]), np.zeros(N-list(i)))

我得到了正确的结果,只是觉得还有一种更优雅的“numpy”方式。有什么想法吗?

标签: pythonnumpy

解决方案


这将起作用:

l = [3, 2, 4, 2, 1, 0]
N = 5

np.where(np.arange(N) >= np.array(l)[np.newaxis].T, 0, 1)

这将创建一个数组,其中包含第一维中的一系列数字和另一个基于l第二维的数组。每个大于或等于 in 对应元素的元素l都设置为 0,每个元素小于 1。

这意味着,例如,对于l(3) 中的第一个元素,结果集中将有 3 个元素为 1。

输出:

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

推荐阅读