如何将1D值列表转换为0';s和1';python中的s

如何将1D值列表转换为0';s和1';python中的s,python,list,multidimensional-array,Python,List,Multidimensional Array,我想获取一个值列表,并将它们转换为一个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和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}')
所需输出:

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}')
当前解决方案:

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}')
您可以尝试以下方法:

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]]
[[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]]
你可以做:

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)
输出:

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]]
[[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]]

如果您正在处理大量数据,那么可能值得使用NumPy。它是什么类型的数据?它来自一个文本文件(我在另一个步骤中将其提取到1D值列表中)。源数据中的所有数字都是整数。这基本上是一种热编码。如果你能使用NumPy,你的生活会更轻松。我已标记了一个副本供您查看。如果您希望减少处理(甚至可能是内存),则可以将
numpy.ndarray
子类化,以便底层数据只是
value\u list
的内容,但返回的视图类似于
output\u table
将numpy导入为np;a=np.数组([1,2,1,3,6,5,4,3]);b=np.arange(1,a.max()+1);c=1*(a[:,None]==b[None,:])
在创建初始数组
x
后,您可以通过
x[np.arange(len(value\u list))、np.array(value\u list)-1]=1同时分配所有行,而无需循环。