如何在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中将单词整合在一起,即二维列表到一维列表?