【问题标题】:'float' object is unsliceable'float' 对象不可切片
【发布时间】:2015-03-21 09:15:12
【问题描述】:

我正在尝试生成两类随机二维点,一类的平均值为 [1,1],另一类的平均值为 [-1,-1]。我写了一个函数,但我得到一个无法弄清楚的错误。我用谷歌搜索但没有找到任何东西。这是我的功能:

def gen_arti_Bis(nbex=10,centerx=1,centery=1,sigma=0.1,epsilon=0.02):
    xpos=np.random.multivariate_normal([centerx,centery],np.diag([sigma,sigma]),nbex/2)
    xneg=np.random.multivariate_normal([-centerx,-centery],np.diag([sigma,sigma]),nbex/2)
    data=np.vstack((xpos,xneg))
    y=np.hstack((np.ones(nbex/2),-np.ones(nbex/2)))
    return data,y

这是我输入 gen_arti() 时的错误消息:

Traceback (most recent call last):
  File "<ipython-input-64-a173cf922dac>", line 1, in <module>
    gen_arti_Bis()
  File "<ipython-input-63-da8720093c11>", line 2, in gen_arti_Bis
    xpos=np.random.multivariate_normal([centerx,centery],np.diag([sigma,sigma]),nbex/2)
  File "mtrand.pyx", line 4308, in mtrand.RandomState.multivariate_normal (numpy/random/mtrand/mtrand.c:23108)
TypeError: 'float' object is unsliceable

【问题讨论】:

    标签: python-3.x numpy anaconda


    【解决方案1】:

    在 Python 3 中,使用 / 运算符的除法总是进行浮点除法,即使运算符两边的数字都是整数。在几个地方,您正在计算 nbex / 2,并将结果作为参数传递,其中 numpy 需要一个整数。

    具体来说,np.random.multivariate 的最后一个参数应该是inttupleints。你传入了一个float,它不会接受,即使浮点数实际上是一个整数(例如5.0)。您还将float 传递给np.ones,但该函数似乎可以正常处理(它忽略输入数字的任何小数部分)。

    对此最基本的解决方法是使用// 运算符显式执行整数除法。将 nbex / 2 的每个位置替换为 nbex // 2,它应该可以按您的预期工作。

    请注意,// 执行的整数除法将始终选择底值(即向下舍入,朝向负无穷大)。如果您想在某些情况下进行不同的舍入,您可能需要使用/ 进行除法,然后使用round 将浮点结果转换为整数(这将舍入一个介于两个整数之间的值一个是偶数)或math.ceil(总是四舍五入)。

    【讨论】:

    • 非常感谢,它成功了。但是你怎么知道这是问题所在?实际上,我没有理解错误消息的含义(不可切片?!)。你能解释一下吗?
    • 我只是在寻找你可能会通过一个意想不到的浮动的地方。我怀疑numpy代码有一些东西可以用isinstance(size, int)检查size参数的类型,然后它会依靠代码来处理一个元组。可以对元组进行切片(例如tup[start:stop]),我猜代码会尝试对任何非整数参数进行切片,从而导致切片浮点数异常。
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多