转换1D列表

时间:2016-08-30 14:15:16

标签: python arrays list numpy transform

我是python的新手,我需要将数字列表(0,1,2,3)转换为2D数组。基本上,它们都具有相同的行号,但是1D列表中的值表示它在2D阵列中的列号。 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))

请欣赏。

4 个答案:

答案 0 :(得分:5)

  

"我想通过不使用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级别的循环,所以即使对于大型数据集也应该很快。

答案 1 :(得分:1)

这是一个单线

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

它使用嵌套的一对理解来做你需要的事情。数组的宽度是硬连线的(range(4)

答案 2 :(得分:0)

假设问题中的想要结果不准确,你可以这样做:

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

答案 3 :(得分:0)

list_1d = [1,0,3,2,0]

矩阵应该有多高?

  

height是1d列表中元素的数量。

height = len(list_1d)

矩阵应该有多宽?

  

width是每个内部列表中元素的数量。

width = max(list_1d)

每个内部列表元素的值应该是什么?

  

0大部分时间。

矩阵元素何时不应为零?

  

当其行是其原始索引且其列是其原始值时。

你能把它表达为布尔值吗?

index == value

你能把它表达为int吗?

  

将bool转换为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]]