【问题标题】:Transform 1D List变换一维列表
【发布时间】:2026-01-24 14:15:01
【问题描述】:

我是 python 新手,我需要将 number(0,1,2,3) 列表转换为二维数组。基本上,它们都有相同的行号,但是一维列表中的值表示它是二维数组中的列号。 2D 列表中的值用 1 标记。例如,示例 1D 列表

list_1d = [1,0,3,2,0]

1
0
3
2
0

我需要把它转换成,

0 1 0 0
1 0 0 0
0 0 1 0
0 1 0 0
1 0 0 0

我创建了一个 2D 零数组,

array_2d = np.zeros((len(list_1d),4))

非常感谢。

【问题讨论】:

  • 也许我遗漏了一些东西,但看起来 1 和 2 导致 array_2d 中的同一行,而 0 导致该行中没有 1,这与您的描述不符。
  • 什么情况下第一列会出现1?
  • array_2d[:][list_1d] = 1 但是,它用 1 标记前 4 行和列
  • @ScottHunter 道歉,我已经更正了描述
  • 1 & 2 still 导致array_2d 中的同一行。

标签: python arrays list numpy transform


【解决方案1】:

“我想通过不使用 for 循环来优化代码,因为我的列表有数百万个元素。”

在这种情况下,使用 numpy:

>>> list_1d = [1,0,3,2,0]
>>> mat = np.zeros((len(list_1d),4))
>>> mat[range(len(list_1d)), list_1d] = 1
>>> mat
array([[ 0.,  1.,  0.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.],
       [ 0.,  0.,  1.,  0.],
       [ 1.,  0.,  0.,  0.]])

因为这种方法避免了在 python 级别的循环,所以即使对于大型数据集也应该很快。

【讨论】:

    【解决方案2】:

    这里是一个班轮

    >>> np.array([[ 1 if i == n else 0 for i in range(4)] for n in list_1d])
    array([[0, 1, 0, 0],
           [1, 0, 0, 0],
           [0, 0, 0, 1],
           [0, 0, 1, 0],
           [1, 0, 0, 0]])
    

    它使用嵌套的几个推导来满足您的需要。数组的宽度是硬连线的(range(4)

    【讨论】:

    • 你可以避免使用max(list_1d) + 1而不是4来编码大小
    【解决方案3】:

    假设问题中想要的结果不准确,您可以这样做:

    list_1d = [1,0,3,2,0]
    
    x_size = max(list_1d) + 1
    y_size = len(list_1d)
    
    matrix = []
    for y in range(y_size):
        line = []
        for x in range(x_size):
            line.append(1 if x == list_1d[y] else 0)
        matrix.append(line)
    
    print matrix
    

    它打印[[0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0]]

    【讨论】:

    • 理想情况下,我想通过不使用 for 循环来优化代码,因为我的列表有数百万个元素。
    【解决方案4】:
    list_1d = [1,0,3,2,0]
    

    矩阵应该有多高?

    height 是一维列表中元素的数量。

    height = len(list_1d)
    

    矩阵应该有多宽?

    width 是每个内部列表中的元素数。

    width = max(list_1d)
    

    每个内部列表元素的值应该是多少?

    大部分时间为 0。

    矩阵元素什么时候不应该为零?

    当它的行是它的原始索引,它的列是它的原始值。

    你能用布尔值表达吗?

    index == value
    

    你能用 int 表达吗?

    只需将 bool 转换为 int。

    行的定义是什么?

    [int(value == index) for index in range(1 + width)]
    

    所有值是什么样的?

    [[int(value == index) for index in range(1 + width)] for value in list_1d]
    

    演示:

    >>> width=max(list_1d)
    >>> [[int(value == index) for index in range(1 + width)] for value in list_1d]
    [[0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0]]
    

    【讨论】: