【问题标题】:Python - TypeError: object of type 'numpy.int32' has no len()Python - TypeError:“numpy.int32”类型的对象没有 len()
【发布时间】:2017-03-24 18:50:42
【问题描述】:

我有以下代码部分:

names = unpickle('batch')
    print('names', names)

    data, labels = [], []
    filename = 'batch'
    batch_data = unpickle(filename)
    for i in range(0, 2):
        if len(data) > 0:
            data = np.vstack((data, batch_data[0][i]))
            labels = np.hstack((labels, batch_data[1][i]))
        else:
            data = batch_data[0][0]
            labels = batch_data[1][0]

    data = data.astype(np.float32)

调用此部分时,出现以下错误:

names [array([1, 1]), array(['118.jpg', '119.jpg'],
      dtype='<U7'), array([[130, 136, 139, ..., 156, 150, 152],
       [151, 156, 161, ..., 160, 173, 171]])]
Traceback (most recent call last):
  File "cnn.py", line 6, in <module>
    name, data, labels = cifar_tools.read_data('C:\\Users\\abc\\Desktop\\temp')
  File "C:\Users\abc\Desktop\Testing\cifar_tools.py", line 36, in read_data
    if len(data) > 0:
TypeError: object of type 'numpy.int32' has no len()

编辑

data 二进制文件如下所示:

[array([1, 1]), array(['118.jpg', '119.jpg'], 
      dtype='<U7'), array([[130, 136, 139, ..., 156, 150, 152],
       [151, 156, 161, ..., 160, 173, 171]])]

我该如何解决这个问题?

谢谢。

【问题讨论】:

  • data = batch_data[0][0] 之后,你希望data 是什么?
  • 感谢您的友好回复。错误似乎在到达那条线之前就出现了。它发生在“如果 len(data) > 0:”上。数据将是图像的像素。
  • if len(data) &gt; 0 不止一次发生,你知道的。
  • 如果有帮助,我已经添加了二进制文件的外观

标签: python numpy pickle


【解决方案1】:

第一次在循环中,data[],所以它采用else 分支。第二次databatch_data[0][0]。那是什么?显然是np.int32,是一个数组的元素。所以它没有长度。

data = []
....
for i in range(0, 2):
    if len(data) > 0:
        data = np.vstack((data, batch_data[0][i]))
        labels = np.hstack((labels, batch_data[1][i]))
    else:
        data = batch_data[0][0]
        labels = batch_data[1][0]

当执行这样的循环时,请确保像 data 这样的变量在每次迭代时具有相同或兼容的类型。如果data 以列表形式开始,则在整个循环中它应该保持为列表。

使用列表追加的正确迭代解决方案

data, labels = [], []
filename = 'batch'
batch_data = unpickle(filename)
for i in range(0, 2):
    data.append(batch_data[0][i])
    labels.append(batch_data[1][i])
data = np.array(data, dtype=float)
labels = np.array(labels) # or leave as list?

使用列表追加,您不必测试 len()==0 特殊情况

但我想知道你是否甚至需要循环:

data = np.array(batch_data[0]))
labels = np.array(batch_data[1])

【讨论】:

  • 感谢您的友好回复。在这种情况下我应该怎么做才能解决错误?
  • 使用列表追加添加建议。
猜你喜欢
  • 2015-01-21
  • 2021-03-03
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 2015-08-21
  • 2019-05-23
相关资源
最近更新 更多