如何将1D值列表转换为0';s和1';python中的s
我想获取一个值列表,并将它们转换为一个0和1的表(2D列表),源列表中每个唯一的数字对应一列,原始列表的行数相等。如果该列索引与原始值-1匹配,则每行将有一个1 我有完成这项任务的代码,但我想知道是否有更好/更快的方法来完成这项任务。(与下面的简化集相比,实际数据集有数百万个条目) 样本输入:如何将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
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同时分配所有行,而无需循环。