python-3.x - “ float ”对象是不可切片的

标签 python-3.x numpy anaconda

我正在尝试生成两类随机 2D 点,一类的平均值为 [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 中,使用 / 运算符进行除法总是进行浮点除法,即使运算符两边的数字都是整数。在多个地方,您计算 nbex/2,并将结果作为参数传递,其中 numpy 需要整数。

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

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

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

关于python-3.x - “ float ”对象是不可切片的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29181051/

相关文章:

database - psycopg2 - 类型错误 : 'int' object is not subscriptable

python - Snakemake 在配置中声明临时文件

python - 多个数组的绘图

python - 如何在 conda 中安装 anaconda 中不可用的软件包

具有可变默认参数的 Python 数据类继承返回零值

Python:pprint的模块错误,打印没有错误

python - 计算两个多维数组之间的相关系数

python - numpy 数组赋值问题

python - 无法在 conda 中安装 matplotlib

python - Anaconda 导出环境文件