Python 转换1D列表
我是python新手,需要将数字列表(0,1,2,3)转换为2D数组。基本上,它们都有相同的行号,但是1D列表中的值表示它在2D数组中的列号。二维列表中的值标记为1。例如,示例1D列表Python 转换1D列表,python,arrays,list,numpy,transform,Python,Arrays,List,Numpy,Transform,我是python新手,需要将数字列表(0,1,2,3)转换为2D数组。基本上,它们都有相同的行号,但是1D列表中的值表示它在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 我已经创建了一个二维零数组 array_2d = np.zeros((len(list_1d),4)) 非常感谢 假设问题中想要的结果不准确,您
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
我已经创建了一个二维零数组
array_2d = np.zeros((len(list_1d),4))
非常感谢 假设问题中想要的结果不准确,您可以这样做:
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]]
这是一条单行线
>>> 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]])
它使用一对嵌套的理解来做您需要的事情。阵列的宽度是硬连线的(范围(4))
“我想通过不使用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级别的循环,所以即使对于大型数据集,它也应该是快速的
list_1d = [1,0,3,2,0]
矩阵应该有多高
height
是1d列表中的元素数
矩阵应该有多宽
width
是每个内部列表中的元素数
每个内部列表元素的值应该是多少
大多数时候是0
什么时候矩阵元素不应该为零
当其行为原始索引,列为原始值时
你能把它表示成布尔值吗
index == value
你能用int表示吗
只需将布尔值转换为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]]
也许我遗漏了什么,但是看起来1和2在
数组_2d
的同一行中出现,而0在该行中出现no 1,这与您的描述不匹配。在什么情况下,1会出现在第一列中?数组_2d[:][list_1d]=1
,它将前4行和前4列标记为1@ScottHunter很抱歉,我已经更正了说明1和2,仍然导致数组\u 2d
中的同一行。理想情况下,我希望通过不使用for循环来优化代码,因为我的列表中有数百万个元素。使用max(list\u 1d)可以避免对大小进行编码+1而不是4
[[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]]