为什么我不能正确地在Python中将项添加到列表中?

时间:2017-09-04 02:04:18

标签: python arrays list numpy

我只是想把项目添加到列表中,我不能!我的代码:

    import numpy as np
    data = [[]] * 10
    for i in range(0, len(data)):
        slice = np.random.randn(100, 100, 3)
        print('before: ', np.shape(data))
        print('slice: ', np.shape(slice))
        data[i].append(slice)
        print('after: ', np.shape(data))

结果如下:

before:  (10, 0)
slice:  (100, 100, 3)
after:  (10, 1, 100, 100, 3)

...

before:  (10, 0)
slice:  (100, 100, 3)
after:  (10, 10, 100, 100, 3)

因此,(100,100,3)未插入data[0]中的正确位置,但创建了额外的维度!为什么?我怎么能避免它?

结果列表的正确尺寸应为(10, 1 ,100,100,3) - 不是(10, 10 ,100,100,3)

1 个答案:

答案 0 :(得分:2)

主要罪魁祸首是

data = [[]] * 10

创建一个空列表并将其复制9次以上,因此实际上您将插入相同的列表10次。例如:

In [113]: data = [[]] * 10

In [114]: data[0].append(1)

In [115]: data
Out[115]: [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]

你应该

  1. 创建一个占位符列表,然后插入第i个元素,或
  2. 创建一个空列表[]并致电.append
  3. 但不是两者兼而有之。

    我建议声明一个空的list

    data = [[] for _ in range(10)]
    

    现在,在循环中调用.append

    data.append(slice)
    

    您可以使用data = np.array(data)将结果转换为数组。这是一个示例:

    data = [[] for _ in range(10)]
    
     for i in range(0, len(data)):
         slice = np.random.randn(100, 100, 3)
         data[i].append(slice)
    
    
    print(np.array(data).shape)
    (10, 1, 100, 100, 3)