我是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))
请欣赏。
答案 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]]