如何在python中将一维值列表转换为0和1的二维网格[重复]

Posted

技术标签:

【中文标题】如何在python中将一维值列表转换为0和1的二维网格[重复]【英文标题】:How to transform 1D list of values to 2D grid of 0's and 1's in python [duplicate] 【发布时间】:2020-05-10 02:36:49 【问题描述】:

我想获取一个值列表并将它们转换为 0 和 1 的表(2D 列表),源列表中的每个唯一数字有一列,原始行数相同。如果该列索引与原始值 1 匹配,则每行将有一个 1。

我有完成这项任务的代码,但我想知道是否有更好/更快的方法来完成它。 (与下面的简化集相比,实际数据集有数百万个条目)

示例输入:

value_list = [1, 2, 1, 3, 6, 5, 4, 3]

期望的输出:

output_table = [[1, 0, 0, 0, 0, 0],
                [0, 1, 0, 0, 0, 0],
                [1, 0, 0, 0, 0, 0],
                [0, 0, 1, 0, 0, 0],
                [0, 0, 0, 0, 0, 1],
                [0, 0, 0, 0, 1, 0],
                [0, 0, 0, 1, 0, 0],
                [0, 0, 1, 0, 0, 0]]

当前解决方案:

value_list = [1, 2, 1, 3, 6, 5, 4, 3]
max_val = max(value_list)

# initialize to table of 0's
a = [([0] * max_val) for i in range(len(value_list))]

# overwrite with 1's where required
for i in range(len(value_list)):
    j = value_list[i] - 1
    a[i][j] = 1

print(f'a = ')
for row in a:
    print(f'row')

【问题讨论】:

如果您要处理大量数据,则可能值得使用 NumPy。它是什么样的数据? 它来自一个文本文件(我在另一个步骤中将其提取到一维值列表中)。源数据中的所有数字都是整数。 这基本上是one-hot编码。如果你可以使用 NumPy,你的生活会更轻松。我已经标记了一个副本供您查看 如果您正在寻找减少处理(甚至可能是内存),可以将numpy.ndarray 子类化,这样底层数据只是value_list 的内容,但返回的视图看起来像output_table import numpy as np; a = np.array([1, 2, 1, 3, 6, 5, 4, 3]); b = np.arange(1,a.max()+1); c = 1 * (a[:,None] == b[None,:]) 【参考方案1】:

你可以这样做:

import numpy as np

value_list = [1, 2, 1, 3, 6, 5, 4, 3]

# create matrix of zeros
x = np.zeros(shape=(len(value_list), max(value_list)), dtype='int')

for i,v in enumerate(value_list):
    x[i,v-1] = 1

print(x)

输出:

[[1 0 0 0 0 0]
 [0 1 0 0 0 0]
 [1 0 0 0 0 0]
 [0 0 1 0 0 0]
 [0 0 0 0 0 1]
 [0 0 0 0 1 0]
 [0 0 0 1 0 0]
 [0 0 1 0 0 0]]

【讨论】:

您可以在创建初始数组x 后,通过x[np.arange(len(value_list)), np.array(value_list) - 1] = 1 不循环地同时分配所有行。【参考方案2】:

你可以试试这个:

dummy_list = [0]*6
output_table = [dummy_list[:i-1] + [1] + dummy_list[i:] for i in value_list]

输出:

output_table = [[1, 0, 0, 0, 0, 0],
                [0, 1, 0, 0, 0, 0],
                [1, 0, 0, 0, 0, 0],
                [0, 0, 1, 0, 0, 0],
                [0, 0, 0, 0, 0, 1],
                [0, 0, 0, 0, 1, 0],
                [0, 0, 0, 1, 0, 0],
                [0, 0, 1, 0, 0, 0]]

【讨论】:

以上是关于如何在python中将一维值列表转换为0和1的二维网格[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将一列中的单词拆分然后在Python中将单词整合在一起,即二维列表到一维列表?

在 Numpy Python 中将一维数组附加到二维数组

Python中如何将二维列表转换成一维列表

使用生成器以及递归实现二维乃至多维列表转换成一维列表(python实现)

python如何通过列表转换为二维码?

如何在python中将光标列表转换为JSON格式?