Как повторить список в другом списке в python

#python #arrays #list #loops #for-loop

Вопрос:

У меня есть список из 43 объектов, а затем каждый объект включает в себя 75 точек. Каждая из этих 75 точек показывает определенное время суток, и я хочу получить стандартное отклонение этого точного времени от каждого из этих 43 объектов. Я читал, что я должен использовать вложенный цикл for, но он показывает матрицу нулей. Кто-нибудь может мне помочь?

 y1 = [
    a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
    a11, a12, a13, a14, a15, a16, a17, a18, a19, a20,
    a21, a22, a23, a24, a25, a26, a27, a28, a29, a30,
    a31, a32, a33, a34, a35, a36, a37, a38, a39, a40,
    a41, a42, a43
]

#an example of what 'a' is
a1 = np.array(df1['Level'][33:108])
a2 = np.array(df1['Mlevel'][105:180])

#get the standard deviation
SD = []
for i in range(43):
    for j in range(75):
        SD.append(np.std(y1[i[j]]))

#plot the standard deviation with mean
for i in range(43):
    axs[0].plot(x1, mean_y1   SD, color='lightblue')
    axs[0].plot(x1, mean_y1 - SD, color='lightblue')
 

Поэтому в основном я хочу повторить цикл ниже j = 0 до 75, но это не работает.

 c0 = []
for i in range(43):
    c0.append((y1[i][0]))
print(np.std(c0))
 

Так что, если кому-то интересно, я понял это, и приведенный ниже код работает:

 #create a list of all the elements (c)
c = []    
for j in range(75):
     for i in range(43): 
         c.append((y1[i][j]))
     
     
#print(c) 

#Get the standard deviation of every 43 points    
start = 0       # First to consider
stop = 3225     # the length of the list c
interval = 43   # chunk size

SD = []
for i in range(start, stop, interval):
    SD.append(np.std(c[i:(i   interval)]))
    
print(SD)
 

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

1. можете ли вы предоставить всю обратную связь?

2. вы получаете доступ [i[j]], но я имею int право: SD.append(np.std(y1[i][j]))

3. Я изменил его, но получаю те же нули, и новая обратная связь выглядит так: Файл «C:/Users/mr179/Desktop/Research/PhD/codes/Averages/SD_WL.py», строка 93, в <модуле> axs[0].график(x1, mean_y1 SD, цвет=’светло-голубой’) Ошибка значения: операнды не удалось передать вместе с фигурами (75,) (3225,)

4. Разве np.std не выполняет для вас вторую часть цикла for? Невозможно узнать, что находится в массивах, без образца данных. Как выглядит y1[0]?

5. @fzzylogic y1[0] будет a1, который сам по себе содержит 75 чисел с плавающей точкой. то, что я ищу, — это получить стандартное отклонение первого элемента от a1 до a43 и повторять это до последнего элемента (75).

Ответ №1:

Вы подписываетесь

 SD.append(np.std(y1[i[j]])) 
 

но i[j] не имеет смысла, потому что i-это число 0,1,2,…, вам лучше ввести

 SD.append(np.std(y1[i][j]))
 

для доступа к элементу списка в списке

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

1. Я попробовал это сначала, и я получаю те же нули, хотя ошибка другая : ошибка значения: операнды не могут передаваться вместе с фигурами (75,) (3225,)

2. Тогда вам может быть интересно написать SD.append(np.std(y1[i])), так как std будет рассчитываться из всего списка, скрытого под y1[i]

3. Это означало бы опустить внутренний цикл для итерации только по i

4. да , но это не то, чего я хочу, я хочу стандартное отклонение каждого элемента от объектов в y1. и не стандартное отклонение каждого объекта.

5. Это означает, что вам нужно создать список со всеми элементами, а затем вычислить std. Не уверен, что я достаточно хорошо понимаю вашу цель.

Ответ №2:

Если у вас есть список, состоящий из элементов, которые все являются массивами из 75 элементов, вы можете преобразовать список в правильный массив и векторизовать операцию стандартного отклонения:

 y1 = np.array(y1)
sd = np.std(y1, axis=0)
 

Используйте axis=1 , если вам нужно стандартное отклонение во все времена каждого дня, а axis=None также для стандартного отклонения всех измерений за все 43 дня.

Вероятно, вы можете упростить графики, вычисляя среднее значение таким же образом:

 my1 = y1.mean(0)
...

    axs[0].plot(x1, my1   sd, color='lightblue')
    axs[0].plot(x1, my1 - sd, color='lightblue')