对象深度以获得所需的数组,numpy随机选择

Posted

技术标签:

【中文标题】对象深度以获得所需的数组,numpy随机选择【英文标题】:Object to deep for desired array, numpy random choice 【发布时间】:2019-03-12 15:35:30 【问题描述】:

这是我一直用来从棒球游戏模拟器中生成随机加权选择的代码,这是我作为我的第一个 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、pandas)。无论我尝试什么,我总是以同样的错误告终。我没有找到任何解决方案,就像我搜索过的一样,甚至很难找到一个很好的解释来解释当我收到这个错误时发生的事情。

【问题讨论】:

我认为您提供的代码和解释不足以帮助您解决当前的问题。 我不知道这个特定的ValueError 的含义,尽管我看到它偶尔会出现在 SO 上。但是您可以通过显示堆栈跟踪来帮助我们(例如,它是否出现在choice 语句中?以及weights 是为了什么?如果问题在于加载权重,我们需要了解excel 文件是什么是什么样的,以及各种加载方法会产生什么。 【参考方案1】:

由于问题似乎与从文件加载的权重有关,让我们探索choice 如何处理如此权重数组:

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

默认 - 很好:

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

总和为 1 的一维数组也可以:

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

但是一个二维数组,即使是正确的大小(列或行)也会产生这个错误:

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

查看ValueError 我看到它通常在使用相关、卷积和各种曲线拟合任务时出现。这使我怀疑编译函数 - 例如np.choice - 和维度问题。我仍然不太确定来源是什么,但堆栈跟踪中的.pyx 文件让我怀疑cython 代码。

您需要做的是向我们展示从excel 源加载的一个或多个问题权重。关注shapedtype。显示示例 csv 文件以及您用于加载它的方法中的一个或多个可能会有所帮助。


网络搜索显示,np.convolvenp.bincount 也会出现此错误。这些也是将一维数组作为输入的函数。

【讨论】:

以上是关于对象深度以获得所需的数组,numpy随机选择的主要内容,如果未能解决你的问题,请参考以下文章

给定数组表示 S 所需的最小数字计数

Numpy

NumPy数组创建例程

如何将csv文件转换为numpy数组格式?

Fortran:普通数组与存储相同数据量的对象所需的 RAM

iOS - 将数组保存到磁盘所需的时间