Python - TypeError:类型' numpy.int32'的对象没有len()

时间:2017-03-24 18:50:42

标签: python numpy pickle

我有以下代码部分:

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]])]

如何解决此问题?

感谢。

1 个答案:

答案 0 :(得分:0)

首次在循环中,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作为列表开始,它应该保持一个列表,直到循环。

使用list append

的正确迭代解决方案
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?

使用list append,你不必测试len()== 0特殊情况

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

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