【问题标题】:TypeError: 'float' object is not subscriptable in 3d arrayTypeError:'float' 对象在 3d 数组中不可下标
【发布时间】:2017-02-25 05:11:28
【问题描述】:

伙计们,我正在尝试编写一个函数来获取 3-D 数组并检查其中有多少单元格是空的。 但我会收到以下错误

in checkpoint
if m[i][j][0] == 0:
TypeError: 'float' object is not subscriptable

我的功能如下

def checkpoint(m, i, j):
    c = 0
    if m[i][j][0] == 0:
        c += 1.0
    if m[i][j][1] == 0:
        c += 1.0
    if m[i][j][2] == 0:
        c += 1.0
    if m[i][j][3] == 0:
        c += 1.0
return c

它来自我正在使用的一个大型模块 这是使用它的功能

def check(m, size):
flag = 2
for i in range(size):
    for j in range(size):
        print(i, j, "/n")
        c = checkpoint(m, i, j)
        s = summ(m, i, j)
        if c == 2:
            if s == 2 or -2:
                flag = 1.0
                if m[i][j][0] == 0:
                    if m[i][j][1] == 0:
                        m[i][j][0] = m[i][j][1] = (-s/2)
                        fix(m, i, j, 0, size)
                        fix(m, i, j, 1, size)
                    elif m[i][j][2] == 0:
                        m[i][j][0] = m[i][j][2] = (-s/2)
                        fix(m, i, j, 0, size)
                        fix(m, i, j, 2, size)
                    else:
                        m[i][j][0] = m[i][j][3] = (-s/2)
                        fix(m, i, j, 0, size)
                        fix(m, i, j, 3, size)
                elif m[i][j][1] == 0:
                    if m[i][j][2] == 0:
                        m[i][j][1] = m[i][j][2] = (-s/2)
                        fix(m, i, j, 1, size)
                        fix(m, i, j, 2, size)
                    elif m[i][j][3] == 0:
                        m[i][j][1] = m[i][j][3] = (-s/2)
                        fix(m, i, j, 1, size)
                        fix(m, i, j, 3, size)
                else:
                    m[i][j][2] = m[i][j][3] = (-s/2)
        if c == 3:
            flag = 1.0
            if m[i][j][0] == 0:
                m[i][j][0] = -s
            elif m[i][j][1] == 0:
                m[i][j][1] = -s
            elif m[i][j][2] == 0:
                m[i][j][2] = -s
            else:
                m[i][j][3] = -s
return m, flag

任何评论都将不胜感激

更新:

我拼命地在模块内运行该函数,我发现检查函数中 i 和 j 的第一次迭代和第二次迭代没有任何问题。但之后将面临错误。

这是我的输出:the output of the code that I'm trying to run

如您所见,在 i in check 函数的第一次迭代中没有任何问题。
这是我的修复功能。它相对于刚刚更改的单元格的箭头更改了其他一些单元格。

def fix(m, i, j, k, size):
ip = i - 1
jp = j - 1
iz = i + 1
jz = j + 1
if ip < 0:
    ip = size - 1
if jp < 0:
    jp = size - 1
if iz > size - 1:
    iz = 0
if jz > size - 1:
    jz = 0
kp = (k+2) % 4
if k == 0:
    m[i][jz][kp] = -1 * m[i][j][k]
if k == 1:
    m[iz][j][kp] = -1 * m[i][j][k]
if k == 2:
    m[i][jp][kp] = -1 * m[i][j][k]
if k == 3:
    m[ip][j][kp] = -1 * m[i][j][k]
return m

在这里您可以找到整个包裹: my code

【问题讨论】:

  • 请出示您正在处理的数据的有效样本。你究竟是如何调用你的方法的?
  • 我确实更新了问题
  • 异常回溯显示异常实际上发生在checkpoint 函数中,而不是直接发生在您显示的代码部分中。在任何情况下,特定错误可能意味着您的 m 数据结构在某个地方搞砸了(它有一个浮点数,您期望内部列表的位置)。由于我们只在您显示的check 函数中看到有效分配,因此错误必须在其他地方(例如,在您调用的fix 中,或者在checkpoint 的某些部分中)。您可能需要发布更多代码!另外,请将回溯发布为文本,而不是屏幕截图。
  • m 可能在您调用此代码之前就有错误数据。如果你在c = checkpoint(m, i, j) 后面加上break,你还能得到它吗?一个调试函数怎么样,它的唯一工作就是测试数组并引发异常异常?您可以将其放在代码的几个部分中。顺便说一句,这段代码真的很长……一个更短的玩具程序如何演示问题?

标签: python arrays python-3.x object typeerror


【解决方案1】:

这意味着 m 实际上不是 3d 数组,代码试图在 float 上执行 [i][i][j][i][j][0]

“容器”是“可编写脚本的”,如 here 所述

【讨论】:

  • 所以你的意思是我应该改变我创建数组的方式?你有什么建议吗?
  • 我不想在 numpy 中使用数组,因为它们会增加我的计算时间。
  • 我看不到你是如何初始化 m 的,但是是的,numpy 会比 python list of lists 创建二维数组(或更高维度)更有效和更快。此处比较的详细信息:stackoverflow.com/questions/993984/…
  • 老兄,我确实更新了这个问题。你能再看一遍吗?我只是发现我的检查功能的第一次迭代没有任何问题。问题将在第二次迭代开始时发生
猜你喜欢
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
相关资源
最近更新 更多