Объект на глубину для желаемого массива, случайный выбор - PullRequest
0 голосов
/ 08 октября 2018

Это код, который я использовал для генерации случайного взвешенного выбора из симулятора бейсбольной игры, над которым я работал в качестве моего первого проекта на Python.

elements = ['1b', '2b', '3b', 'hr', 'bb', 'k', 'out']
        if order_pos_away == 1:
            weights = ab1
        if order_pos_away == 2:
            weights = ab2
        if order_pos_away == 3:
            weights = ab3
        if order_pos_away == 4:
            weights = ab4
        if order_pos_away == 5:
            weights = ab5
        if order_pos_away == 6:
            weights = ab6
        if order_pos_away == 7:
            weights = ab7
        if order_pos_away == 8:
            weights = ab8
        if order_pos_away == 9:
            weights = ab9
        from numpy.random import choice
        c = choice(elements, p=weights)

Каждый раз, когда циклпробег через order_pos_away увеличен на 1, поэтому он будет принимать список вероятностей следующего теста, который в сумме составит ровно 1. Когда список вероятностей введен вручную, у меня нет проблем.Однако, когда я пытаюсь импортировать их из листа Excel, где они хранятся, я получаю сообщение об ошибке:

ValueError: object too deep for desired array

Я пробовал несколько способов получения данных Excel в python (read_csv, xlrd, numpy,панды).Независимо от того, что я пытаюсь, я всегда получаю одну и ту же ошибку.Я не нашел решения для этого, так как искал, и мне было трудно даже найти хорошее объяснение того, что происходит, когда я получаю эту ошибку.

1 Ответ

0 голосов
/ 08 октября 2018

Поскольку проблема, похоже, связана с весами, загруженными из файла, давайте рассмотрим, как choice ведет себя с массивами весов:

In [227]: elements=['1b', '2b', '3b', 'hr', 'bb', 'k', 'out']

по умолчанию - отлично:

In [228]: np.random.choice(elements)
Out[228]: 'k'

1d массив с суммой 1 тоже подойдет:

In [229]: np.random.choice(elements, p=np.ones(7)/7)
Out[229]: '2b'

Но 2d массив даже правильного размера (столбцы или строки) выдает эту ошибку:

In [230]: np.random.choice(elements, p=np.ones((1,7))/7)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-230-0be221b99732> in <module>()
----> 1 np.random.choice(elements, p=np.ones((1,7))/7)

mtrand.pyx in mtrand.RandomState.choice()

ValueError: object too deep for desired array

In [231]: np.random.choice(elements, p=np.ones((7,1))/7)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-231-88812915113a> in <module>()
----> 1 np.random.choice(elements, p=np.ones((7,1))/7)

mtrand.pyx in mtrand.RandomState.choice()

ValueError: object too deep for desired array

Lookingдо ValueError Я видел, что обычно это происходит при использовании корреляции, свертки и различных задач подбора кривой.Это заставило меня заподозрить скомпилированную функцию, такую ​​как np.choice, и проблему измерения.Я все еще не совсем уверен, что является источником, но файл .pyx в трассировке стека заставляет меня подозревать cython код.

Что вам нужно сделать, это показать нам один или несколько весов проблемыкак загружено из excel источника.Сосредоточьтесь на shape и dtype.Это может помочь показать пример файла csv и один или несколько методов, которые вы использовали для его загрузки.


Поиск в Интернете показывает, что эта ошибка появляется с np.convolve и np.bincount какЧто ж.Это тоже функции, которые принимают в качестве входных данных 1d-массивы.

...