Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 转换1D列表_Python_Arrays_List_Numpy_Transform - Fatal编程技术网

Python 转换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)) 非常感谢 假设问题中想要的结果不准确,您

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

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