Перечисление каждой итерации прокатки шестигранной матрицы в Python

#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! Я думаю, это делает обходной путь еще более быстрым и менее грязным 🙂