как выполнить заполнение вложенного списка

#python #numpy

#python #numpy

Вопрос:

У меня есть вложенный список, который содержит 1002 временных шага, и на каждом временном шаге я наблюдаю за 11 функциями. Я прочитал документы, связанные с заполнением, но я действительно не мог узнать, как добавить нулевые элементы в конец каждого списка. Я обнаружил, что наибольшая длина списков — это, например, 24-й элемент в моем основном списке, и теперь я хочу дополнить все остальные элементы на основе этого, если только 24-й элемент уже не имеет формы.В качестве примера:

 a = [[1,2,3,4,5,6,76,7],[2,2,3,4,2,5,5,5,,7,8,9,33,677,8,8,9,9],[2,3,46,7,8,9,],[3,3,3,5],[2,2],[1,1],[2,2]]

a[1] = padding(a[1],len(a[2]) with zeros at the end of the list)
  

Я сделал ниже:

 import numpy as np
def pad_or_truncate(some_list, target_len):
    return some_list[:target_len]   [0]*(target_len - len(some_list))


for i in range(len(Length)):
    pad_or_truncate(Length[i],len(Length[24]))
    
    print(len(Length[i]))
  

или

 for i in range(len(Length)):
   df_train_array = np.pad(Length[i],len(Length[24]),mode='constant') 
  

и я получил эту ошибку: Unable to coerce to Series, length must be 11: given 375

Комментарии:

1. Каким должен быть идеальный результат?

2. @SebastienD на самом деле ваше решение было приятным и полезным, просто я получил эту ошибку operands could not be broadcast together with shapes (788,11) (1163,) , но я думаю, что мне нужно проверить что-то еще

Ответ №1:

Решение 1

 # set the max number of 0
max_len = max([len(x) for x in a])

# add zeros to the lists
temp = [x  [0]*max_len for x in a]

#Limit the output to the wished length
[x[0:max_len] for x in temp]
  

Решение 2 с использованием pandas

 import pandas as pd
df = pd.DataFrame(a)
df.fillna(0).astype(int).values.tolist()
  

Вывод

 [[1, 2, 3, 4, 5, 6, 76, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [2, 2, 3, 4, 2, 5, 5, 5, 7, 8, 9, 33, 677, 8, 8, 9, 9],
 [2, 3, 46, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 ...]
  

Комментарии:

1. второе решение не сработало, первое смогло определить наибольшую длину списка, но опять же я не смог увеличить длину на максимальную величину.

2. @john22: был бы рад помочь, если у вас возникнут дополнительные проблемы

3. @ Ну, с использованием этой строки MAX_LEN = np.expand_dims(max_len, axis=-1) и заменой ваших усилий temp = [x [0]*MAX_LEN for x in df_train_array] вышеупомянутой проблемой стало исправлено. но теперь, когда я проверяю форму временных или новых элементов списка, они такие же, как и раньше. Я имею в виду, что после этого ничего не происходит. даже я сохранил результат в новом списке, но опять ничего не произошло.

Ответ №2:

Следующий фрагмент кода должен дополнять отдельные списки соответствующим количеством нулей (в зависимости от размера списка с максимальным количеством элементов)

 def main():
    data = [
        [1,2,3,4,5,6,76,7],
        [2,2,3,4,2,5,5,5,7,8,9,33,677,8,8,9,9],
        [2,3,46,7,8,9,],
        [3,3,3,5],
        [2,2],
        [1,1],
        [2,2]
    ]

    # find the list with the maximum elements
    max_length = max(map(len, data))

    for element in data:
        for _ in range(len(element), max_length):
            element.append(0)


if __name__ == '__main__':
    main()
  

Комментарии:

1. Ваше решение также хорошо в примере, но в реальных данных я получил ошибку 'numpy.ndarray' object has no attribute 'append' . Я попытался превратить свои данные в массив numpy, и я не хочу его снова менять

Ответ №3:

Вы можете использовать эту простую строку, которая использует np.pad

 list(map(lambda x: np.pad(x, (max(map(len, a)) - len(x), 0)).tolist(), a))
  
 [[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 76, 7],
 [2, 2, 3, 4, 2, 5, 5, 5, 7, 8, 9, 33, 677, 8, 8, 9, 9],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 46, 7, 8, 9],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 5],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2]]
  

Используйте это, если вместо этого вы хотите заполнить конец:

 list(map(lambda x: np.pad(x, (0, max(map(len, a)) - len(x))).tolist(), a))
  

Комментарии:

1. Я попробовал, но снова это дало мне одинаковую длину для каждого списка

2. Я имею в виду, что в приведенном выше примере это работает, но я пишу это в своем коде, чтобы ничего не делать, поскольку мой основной список имеет 1002 временных шага, и каждый раз есть много наблюдений. Но было интересно, что ваше решение способно найти максимальную длину списка.