Вопрос или проблема
Я пытаюсь использовать numpy для генерации массива из 60 случайных чисел (либо 0
, либо 1
, то есть подмножества Бернулли биномиального распределения). Эта первая часть кода работает хорошо, так как генерирует 60 случайных (0
или 1
значений на основе заданной вероятности).
Однако затем я хочу изменить значения этого первого сохраненного массива (сохраненного в ‘result’) с помощью numpy.where()
, так что для каждого элемента, если он равен 1
, он становится "Z"
, а если 0
, то заменяется другим случайным биномиальным числом.
Многие итерации кода показывают, что он заменяет 1
на "Z"
, но он не изменяет ни один из нулей, так как в конце концов я должен найти некоторые новые 1
там, где были нули, и этого не происходит.
import numpy
n = 50 #Количество повторений
p = 0.1
count = 0
# Первый день симуляции
result = numpy.random.binomial(1, p, 60)
print(result)
for ele in result:
if (ele == 1):
count = count +1
print("Количество зараженных:", count)
# Создать матрицу для отслеживания, кто заражен
result = numpy.where(result == 1, "Z", numpy.random.binomial(1,p*count))
count = 0
for ele in result:
if (ele == 1):
count = count +1
# while count > 0: В КОНЦЕ ВЫ ПОПАДЕТЕ В ЭТО УСЛОВИЕ #
# i-й день симуляции #
#for ele in result:
# if (ele == 0):
# ele == "X"
# else:
# ele == "I"
print(result)
print("Количество зараженных:", count)
ТЕКУЩИЙ РЕЗУЛЬТАТ:
[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0]
Количество зараженных: 5
['0' 'Z' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' 'Z' '0' '0'
'0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0'
'0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' 'Z' 'Z'
'0' '0' '0' 'Z' '0' '0']
Количество зараженных: 0
Замените вашу строку numpy.where() на эту:
new_values = numpy.random.binomial(1, p * count, size=result.size)
result = numpy.where(result == 1, "Z", new_values)
Это заменит нули массивом новых случайных значений.
Ответ или решение
Для модификации массива с использованием numpy.where()
на основе условного оператора, давайте рассмотрим вопрос более подробно.
Шаг 1: Генерация случайного массива
Сначала нам необходимо сгенерировать массив из 60 случайных элементов, где каждый элемент – 0 или 1. В вашем случае вы используете numpy.random.binomial()
, что абсолютно правильно.
import numpy as np
n = 50 # Количество повторений
p = 0.1 # Вероятность получения "1"
result = np.random.binomial(1, p, 60) # Генерация массива
print(result)
count = np.sum(result) # Подсчёт общего количества "инфицированных" (1)
print("Number Infected:", count)
Шаг 2: Модификация массива с использованием numpy.where()
В данном шаге мы используем numpy.where()
для замены элементов массива. Ваша цель заключается в том, чтобы:
- Заменить все 1 на "Z".
- Заменить 0 на новые случайные значения, которые также могут быть 0 или 1, основанные на вероятности.
Чтобы правильно сгенерировать новые значения для нулей, важно, чтобы размер нового массива совпадал с количеством нулей в исходном массиве. Чтобы это сделать, мы можем создать случайный массив нужного размера, который будет определяться текущим количеством "инфицированных".
# Создание массива новых значений для замены нулей
new_values = np.random.binomial(1, p * count, size=np.sum(result == 0)) # Генерация новых значений
result = np.where(result == 1, "Z", new_values) # Замена 1 на "Z" и 0 на новые случайные значения
print(result)
Шаг 3: Подсчет новых "инфицированных"
После выполнения модификации массива необходимо пересчитать количество "инфицированных" из нового массива. Это делается аналогично первому подсчету:
count = np.sum(result == 1) # Подсчет новых "инфицированных"
print("Number Infected:", count)
Полный код
Вот полная версия кода, которая учитывает все вышесказанные шаги:
import numpy as np
n = 50 # Количество повторений
p = 0.1 # Вероятность получения "1"
# Генерация начального массива
result = np.random.binomial(1, p, 60)
print("Initial result:", result)
# Подсчет инфицированных
count = np.sum(result)
print("Number Infected:", count)
# Замена значений
new_values = np.random.binomial(1, p * count, size=np.sum(result == 0)) # Генерация новых значений для нулей
result = np.where(result == 1, "Z", new_values) # Использование numpy.where для замены
print("Modified result:", result)
# Подсчет новых "инфицированных"
count = np.sum(result == 1) # Подсчет "инфицированных" в новом массиве
print("Number Infected:", count)
Заключение
Используя метод numpy.where()
правильно, вы можете эффективно модифицировать массивы на основе заданных условий. Всегда учитывайте размер нового массива, чтобы избежать ошибок при замене значений. Убедитесь, что ваши значения генерируются корректно, чтобы итоговый массив соответствовал вашим ожиданиям.