#python #list #numpy #for-loop #append
#python #Список #numpy #для цикла #добавить
Вопрос:
Я работаю над анимированным столбчатым графиком, чтобы показать, как частоты чисел при прокатке шестигранного кубика сходятся, чем больше вы бросаете кубик. Я хотел бы показывать числовые частоты после каждой итерации, и для этого я должен получить список числовых частот для этой итерации в другом списке. Вот код до сих пор:
import numpy as np
import numpy.random as rd
rd.seed(23)
n_samples = 3
freqs = np.zeros(6)
frequencies = []
for roll in range(n_samples):
x = rd.randint(0, 6)
freqs[x] = 1
print(freqs)
frequencies.append(freqs)
print()
for x in frequencies:
print(x)
Вывод:
[0. 0. 0. 1. 0. 0.]
[1. 0. 0. 1. 0. 0.]
[1. 1. 0. 1. 0. 0.]
[1. 1. 0. 1. 0. 0.]
[1. 1. 0. 1. 0. 0.]
[1. 1. 0. 1. 0. 0.]
Желаемый результат:
[0. 0. 0. 1. 0. 0.]
[1. 0. 0. 1. 0. 0.]
[1. 1. 0. 1. 0. 0.]
[0. 0. 0. 1. 0. 0.]
[1. 0. 0. 1. 0. 0.]
[1. 1. 0. 1. 0. 0.]
Верхние три списка действительно показывают частоты чисел после каждой итерации. Однако, когда я пытаюсь добавить список в список ‘frequencies’, в конце он просто показывает конечные числовые частоты каждый раз, как это видно в трех нижних списках. Это поставило меня в тупик, и я довольно новичок в Python. Как можно получить каждый список, как в первых трех списках вывода, в другом? Заранее спасибо!
Ответ №1:
Вы можете сделать это так, изменив только frequencies.append(freqs)
с frequencies.append(freqs.copy())
помощью . Таким образом, вы можете создать копию freqs
, которая не зависела бы от оригинала freqs
. Изменение freqs
не изменится freqs.copy()
.
import numpy as np
import numpy.random as rd
rd.seed(23)
n_samples = 3
freqs = np.zeros(6)
frequencies = []
for roll in range(n_samples):
x = rd.randint(0, 6)
freqs[x] = 1
print(freqs)
frequencies.append(freqs.copy())
print(frequencies)
print()
for x in frequencies:
print(x)
Ответ №2:
Python отслеживает freqs как единый идентификатор, и его значение изменяется даже после его добавления. Для этого есть хорошее объяснение за пределами моего понимания = P
Однако здесь есть быстрая и грязная работа:
import numpy as np
import numpy.random as rd
rd.seed(23)
n_samples = 3
freqs = np.zeros(6)
frequencies = []
for roll in range(n_samples):
x = rd.randint(0, 6)
freqs_copy = []
for item in freqs:
freqs_copy.append(item)
freqs_copy[x] = 1
print(freqs_copy)
frequencies.append(freqs_copy)
print()
for x in frequencies:
print(x)
Идея состоит в том, чтобы сделать копию «freqs», которая была бы независимой от оригинальных «freqs». В приведенном выше коде «freqs_copy» будет уникальным для каждой итерации.
Комментарии:
1. Вы можете заменить
freqs_copy = []; for item in freqs:; freqs_copy.append(item)
наfreqs_copy = freqs.copy()
.2. Спасибо, Guimoute! Я думаю, это делает обходной путь еще более быстрым и менее грязным 🙂