我有以下代码部分:
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]])]
如何解决此问题?
感谢。
答案 0 :(得分:0)
首次在循环中,data
为[]
,因此需要else
分支。第二次data
是batch_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])