#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 временных шага, и каждый раз есть много наблюдений. Но было интересно, что ваше решение способно найти максимальную длину списка.