使用astype(int)将numpy数组转换为整数在Python 3.6上不起作用

时间:2018-01-03 21:39:22

标签: python arrays numpy

我有一个大文本文件,每行标有0或1,如下所示:

1
0
0
1
...

我加载它,将其转换为numpy数组,然后我想将数组转换为dtype=int64(因为我认为这些是字符串)。我是这样做的:

def load_data(infile):
    text_file = open(infile,'r')
    text = text_file.readlines()
    text = map(str.strip,text)
    return text
labels = load_data('labels.txt')
labels_encoded = np.array(labels)
labels_encoded = labels_encoded.astype(int)

它在Python 2.7中运行良好,我可以稍后使用我的代码在数组上工作,但是现在我遇到了Python 3.6,当我运行代码时,我收到错误:

Traceback (most recent call last):
   File "dText.py", line 77, in <module>
   labels_encoded = labels_encoded.astype(int)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'map'

任何人都可以帮我弄清楚这里发生了什么,以及如何让它在Python 3.6上运行?我也尝试过:

labels_encoded = np.int_(labels_encoded)

但我得到了同样的错误。我正在使用numpy版本1.13.3。感谢。

2 个答案:

答案 0 :(得分:2)

您正在将地图对象传递到数组并尝试转换它。一旦创建了数组,就看看它。它看起来像这样:

array(<map object at 0x127680cf8>, dtype=object)

请尝试使用list(map(...))

def load_data(infile):
    text_file = open(infile,'r')
    text = text_file.readlines()
    text = list(map(str.strip,text))
    return text
labels = load_data('labels.txt')
labels_encoded = np.array(labels)
labels_encoded = labels_encoded.astype(int)
labels_encoded
array([1, 0, 1, 0])

如果您只是从2.7跳转,则应注意map不再返回列表,而是可迭代。

答案 1 :(得分:0)

我有同样的问题。我的代码无效:

train_size = np.ceil(len(dataset) * 0.8).astype(int)
print(type(train_size))  # --> numpy.int32

但这很好用:

train_size = int(np.ceil(len(dataset) * 0.8))
print(type(train_size))  # --> int