Сумма n значений n-списков с одинаковым индексом в Python

#python #numpy #matrix #plot #random

Вопрос:

Например, у меня есть 5 списков по 10 элементов, каждый из которых сгенерирован со случайными значениями, имитирующими бросок монеты.

Я получаю свои 5 списков с 10 элементами следующим образом:

 result = [0,1] #0 is tail #1 is head
probability = [1/2,1/2]
N = 10
list = []

def list_generator(number): #this number would be 5 in this case
    for i in range(number):
        n_round = np.array(rnd.choices(result, probability, k=N)) 
        print(n_round)

list_generator(5)



And for example I would get this
[1 1 0 0 0 1 0 1 1 0]
[0 1 0 0 0 1 1 1 0 1]
[1 1 0 0 1 1 1 0 1 1]
[0 0 0 1 0 0 0 1 0 0]
[0 0 1 1 0 0 0 0 1 1]
 

Как я могу суммировать только числа того же столбца, я имею в виду, я хотел бы получить список, который добавляет значение 1 0 1 0 0 (первый столбец), затем этот список добавляется сумма из каждого второго жеребьевка каждого раунда, т. е. 1 1 1 0 0 (во втором столбце) и так далее с десяти бросков монеты
(Мне это нужно в списке, потому что я буду использовать это для построения графика)

Я думал о создании матрицы с каждым массивом и суммировании только n-го столбца и добавлении этого значения в список, но я не знаю, как это сделать, у меня мало знаний об использовании массивов.

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

1. Какой код вы пробовали? И это проблема с домашним заданием?

2. Я пытался использовать вложенные циклы for и np.matrix (), но ничего не получалось. Нет, это не домашнее задание, это всего лишь особый случай, который помогает мне понять, как python работает с матрицами и массивами.

Ответ №1:

Пусть ваша функция return представляет собой массив 2d numpy, а затем sum вдоль требуемой оси. Отдельно вам не нужно передавать вероятность random.choices , так как по умолчанию используются равные вероятности.

 import random
import numpy as np

def list_generator(number):
    return np.array([np.array(random.choices([0,1], k=10)) for i in range(number)])

a = list_generator(5)

>>> a
array([[0, 1, 1, 1, 0, 1, 1, 0, 0, 0],
       [1, 0, 1, 0, 1, 1, 1, 1, 1, 0],
       [1, 1, 0, 1, 1, 1, 0, 0, 1, 1],
       [1, 1, 0, 0, 1, 1, 1, 1, 0, 0],
       [0, 1, 1, 0, 0, 1, 1, 1, 0, 0]])

>>> a.sum(axis=0)
array([3, 4, 3, 2, 3, 5, 4, 3, 2, 1])
 

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

1. Большое спасибо!! Я не думал использовать np.array с другим np.array.

2. Рад помочь! 🙂

3. То, что работает, — это не «использование использования np.массива с другим np.массивом», а скорее фактическое возвращение чего-то из list_generator функции. В исходном коде вы ничего не вернули из своей функции. Вместо этого вы просто напечатали строки массива.

Ответ №2:

Вы можете использовать numpy.random.randint для генерации ваших рандомизированных данных. Затем используйте sum , чтобы получить сумму столбцов:

 import numpy as np

N = 10

data = np.random.randint(2, size=(N, N))

print(data)
print(data.sum(axis=0))
 

 [[1 0 1 1 1 1 0 0 1 1]
 [0 0 1 1 0 0 1 1 1 0]
 [1 1 0 1 1 1 0 0 1 1]
 [1 1 0 0 0 0 1 1 1 1]
 [1 0 0 1 1 1 0 1 1 1]
 [1 0 1 1 0 1 0 1 1 1]
 [0 0 0 1 0 1 0 1 1 0]
 [0 0 0 1 0 1 0 1 0 1]
 [1 0 0 0 1 0 1 0 1 1]
 [1 0 1 1 0 1 0 0 0 1]]
[7 2 4 8 4 7 3 6 8 8]
 

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

1. Спасибо. Я никогда не слышал о множестве методов и функций, позволяющих делать то, о чем я просил!