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)
答案 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的基础。