заполнение массива numpy

#python #numpy

#python #numpy

Вопрос:

Я создаю массив numpy zero размером 10×5 и хочу заполнить каждый столбец перемешанным списком чисел от 1 до 10. Однако у меня проблема, потому что он заполняет только первый столбец, а list.pop() не работает, плюс я думаю, что мои вложенные циклы for, хотя я пытался использовать строку и настройки в другом порядке. Буду признателен за любую помощь.

 i = 0
j = 0

for column in matrix:

    preferences = [1,2,3,4,5,6,7,8,9,10]

    random.shuffle(preferences)

    for number in preferences:

        for row in matrix:
            chosen = preferences.pop(0)
            matrix[j,i] = chosen
        j = 1

i = 1
 

Ответ №1:

Поскольку вы использовали pop в своем примере, я подумал, что вы, возможно, не захотите повторять в каждом столбце. numpy.random.shuffle перетасовывает элементы на месте.

 >>> M = N.repeat(N.arange(1,11), 5).reshape(10,-1)
>>> M
array([[ 1,  1,  1,  1,  1],
       [ 2,  2,  2,  2,  2],
       [ 3,  3,  3,  3,  3],
       [ 4,  4,  4,  4,  4],
       [ 5,  5,  5,  5,  5],
       [ 6,  6,  6,  6,  6],
       [ 7,  7,  7,  7,  7],
       [ 8,  8,  8,  8,  8],
       [ 9,  9,  9,  9,  9],
       [10, 10, 10, 10, 10]])
>>> for i in range(5): 
...    N.random.shuffle(M[:,i])
>>> M
array([[ 3,  9,  7,  9,  2],
       [ 5,  4,  2,  5,  3],
       [ 8,  8,  8,  1,  4],
       [ 1,  2,  6, 10,  8],
       [ 2,  1,  9,  2,  5],
       [ 7,  7, 10,  7,  1],
       [ 4,  3,  5,  8,  9],
       [ 6,  5,  4,  4,  7],
       [10, 10,  3,  6,  6],
       [ 9,  6,  1,  3, 10]])
>>>
 

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

1. причина, по которой я использовал циклы for для вставки, потому что позиции 1 и 10 важны для меня (1 означает самый любимый, а 10 — наименьший). Ваш способ означал бы, что я бы создавал и заполнял, а затем просматривал и находил.

2. метод doug имеет вероятность 1/10 выбора одного из 10 значений независимо от того, какие другие значения выбраны. Например, в последнем столбце его есть две 7 и три 5. Мой метод исправил, что один столбец имеет одно и только одно из 10 значений. Выберите тот, который вам нужен.

Ответ №2:

 >>> import numpy as NP

>>> fnx = lambda v : NP.random.randint(1, 11, v)
>>> A = NP.zeros(5, 10)
>>> for c in range(A.shape[0]):
        A[c,:] = fnx(10)
>>> A = A.T
>>> A
  array([[  5.,   1.,   3.,   8.,   5.],
         [  4.,  10.,   4.,   3.,  10.],
         [  6.,   6.,   3.,   2.,   7.],
         [  4.,   4.,  10.,   5.,   4.],
         [  8.,   6.,   6.,   2.,  10.],
         [ 10.,   9.,  10.,   6.,  10.],
         [  7.,   4.,   2.,   2.,   7.],
         [  9.,   2.,   9.,   4.,   7.],
         [ 10.,   5.,   3.,   5.,   7.],
         [  3.,   9.,   3.,   3.,   1.]])
 

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

1. я хочу, чтобы в каждом столбце был перемешанный список от одного до 10.