是否有一种“ numpy”方式将一维Numpy数组扩展到二维,其输出值取决于原始值?

时间:2019-04-06 04:27:42

标签: python numpy

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

我已经使用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)))

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

1 个答案:

答案 0 :(得分:1)

这将起作用:

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

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

这将在第一个维度中创建一个包含数字范围的数组,在第二个维度中创建一个基于l的数组。大于或等于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]])