如何将记录数组从arff文件转换为ndarray?

时间:2018-12-28 02:43:08

标签: python python-3.x numpy arff

ARFF documentation告诉我,我的文件正在作为记录数组读取,但是我似乎无法像普通记录数组一样将其转换为ndarray。应该有具有55个功能的11055个示例。

df=pd.concat([df.drop_duplicates(['ID']).assign(sign='first'),df.drop_duplicates(['ID'],keep='last').assign(sign='last')]).sort_values('ID')
df
     Time ID   X    Y   sign
0    8:00  A  23  100  first
4   20:00  A  35  220   last
5    9:00  B  24  110  first
9   23:00  B  38  250   last
10  11:00  C  26  130  first
14  22:00  C  37  240   last
15  15:00  D  30  170  first
15  15:00  D  30  170   last

基本上,我试图将存储在>>> dataset.shape (11055,) >>> dataset[0] (b'1', b'1', b'1', b'1', b'1', b'-1', b'1', b'1', b'-1', b'1', b'1', b'1', b'1', b'0', b'0', b'-1', b'1', b'1', b'0', b'1', b'1', b'1', b'1', b'1', b'1', b'1', b'1', b'1', b'0', b'1', b'1') >>> dataset.dtype dtype([('having_IP_Address', 'S2'), ('URL_Length', 'S2'), ('Shortining_Service', 'S2'), ('having_At_Symbol', 'S2'), ('double_slash_redirecting', 'S2'), ('Prefix_Suffix', 'S2'), ('having_Sub_Domain', 'S2'), ('SSLfinal_State', 'S2'), ('Domain_registeration_length', 'S2'), ('Favicon', 'S2'), ('port', 'S2'), ('HTTPS_token', 'S2'), ('Request_URL', 'S2'), ('URL_of_Anchor', 'S2'), ('Links_in_tags', 'S2'), ('SFH', 'S2'), ('Submitting_to_email', 'S2'), ('Abnormal_URL', 'S2'), ('Redirect', 'S1'), ('on_mouseover', 'S2'), ('RightClick', 'S2'), ('popUpWidnow', 'S2'), ('Iframe', 'S2'), ('age_of_domain', 'S2'), ('DNSRecord', 'S2'), ('web_traffic', 'S2'), ('Page_Rank', 'S2'), ('Google_Index', 'S2'), ('Links_pointing_to_page', 'S2'), ('Statistical_report', 'S2'), ('Result', 'S2')]) 中的此记录数组转换为ndarray并对其进行整形以匹配矢量尺寸。问题似乎是我留下的ndarray是具有长记录dtype的对象列表,而不是列表列表。我只是不确定如何将dtype转换为列表。

dataset

最后一行导致错误from scipy.io import arff import urllib.request import io import numpy as np # this just reads the arff from its URL url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00327/Training%20Dataset.arff" ftpstream = urllib.request.urlopen(url) dataset, meta = arff.loadarff(io.StringIO(ftpstream.read().decode('utf-8'))) num_features = len(meta.names()) num_examples = dataset.shape[0] dataset.view(np.ndarray).reshape(num_examples, num_features)

我最终希望得到的是形状(11055,31)和数字dtype的ndarray。

您可以找到数据here。但是文件如下所示:

ValueError: cannot reshape array of size 11055 into shape (11055,31)

1 个答案:

答案 0 :(得分:1)

看文件,我们可以看到所有字段都是分类类型的,而不是数字类型的。除此之外,您的数组是具有复杂dtype的常规ndarray。由于这不是您可以更改的内容,因此必须转换数组的结构和dtype。最整洁的方法(尽管不是最有效的方法)将会是

dataset = np.array(dataset.tolist(), dtype=np.int8)

tolist会将数组转换为元组列表,然后简单的dtype int8将其重新组合成常规数组。

这个问题是converting numpy array of string fields to numerical format的基础。