我有一个canActivate(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): boolean {
let roles = route.data["roles"] as Array<string>;
return (roles == null || roles.indexOf("the-logged-user-role") != -1);
}
我试图从CSV文件中读取。
我可以通过ndarray
从文件中读取它,但无法获得我想要的结构;而不是2D数组我有一个元组数组
作为MCVE:而不是numpy
之类的2D数组,我有DataSet1
:
DataSet2
输出结果为:
dataset=numpy.array([
["abc ",3000.0,1],
["def",3650.0,1],
["xyz",3000.0,2]
])
print("DataSet1\n",dataset)
print("DataSet1-Shape\n",dataset.shape)
dataset2=numpy.array([])
dataset2 = np.genfromtxt('file.csv', delimiter=",",dtype='S32,float,int')
print("DataSet2\n",dataset2)
print("DataSet2-Shape\n",dataset2.shape)
我希望DataSet2成为2D的DataSet1。
CSV文件内容:
DataSet1
[['abc ' '3000.0' '1']
['def' '3650.0' '1']
['xyz' '3000.0' '2']]
DataSet1-Shape
(3, 3)
DataSet2
[(b'"fabc"', 3000.0, 1) (b'"fdef"', 3650.0, 1) (b'"ghi"', 3000.0, 2)]
DataSet2-Shape
(3,)
答案 0 :(得分:1)
使用列表推导并将元组转换为包含np.array([list(tup) for tup in dataset2])
的列表应该有效:
>>> np.array([list(tup) for tup in dataset2])
array([['"fabc"', '3000.0', '1'],
['"fdef"', '3650.0', '1'],
['"ghi"', '3000.0', '2']],
dtype='|S6')
>>> np.array([list(tup) for tup in dataset2]).shape
(3, 3)
另请注意,dataset2 = numpy.array([])
无效,因为下一行会覆盖dataset2
。
修改:[list(tup) for tup in dataset2]
是map(list, dataset2)
对于np数组中的混合类型,请参阅Store different datatypes in one NumPy array?;我建议你改用pandas.DataFrame
。
答案 1 :(得分:0)
您的化合物dtype
将文件加载为包含3个字段的1d数组
In [195]: data=np.genfromtxt('stack39872346.txt',delimiter=',',dtype='S32,float,int')
In [196]: data
Out[196]:
array([(b'"fabc"', 3000.0, 1), (b'"fdef"', 3650.0, 1),
(b'"ghi"', 3000.0, 2)],
dtype=[('f0', 'S32'), ('f1', '<f8'), ('f2', '<i4')])
In [197]: data.shape
Out[197]: (3,)
In [198]: data.dtype
Out[198]: dtype([('f0', 'S32'), ('f1', '<f8'), ('f2', '<i4')])
你的Dataset1
是2d,字符串为dtype:
In [207]: Dataset1
Out[207]:
array([['abc ', '3000.0', '1'],
['def', '3650.0', '1'],
['xyz', '3000.0', '2']],
dtype='<U6')
将复合dtype转换为简单的dtype有点棘手。可以使用astype
完成。但也许使用data
的列表版本作为中介更简单。
In [203]: data.tolist()
Out[203]: [(b'"fabc"', 3000.0, 1), (b'"fdef"', 3650.0, 1), (b'"ghi"', 3000.0, 2)]
In [204]: np.array(data.tolist())
Out[204]:
array([[b'"fabc"', b'3000.0', b'1'],
[b'"fdef"', b'3650.0', b'1'],
[b'"ghi"', b'3000.0', b'2']],
dtype='|S6')
np.array
已读取元组列表,并创建了一个最常见类型的{2}数组S6
(Py3字节串)
现在很容易使用astype
转换为unicode字符串:
In [205]: np.array(data.tolist()).astype("U6")
Out[205]:
array([['"fabc"', '3000.0', '1'],
['"fdef"', '3650.0', '1'],
['"ghi"', '3000.0', '2']],
dtype='<U6')
这类似于Dataset1
,但第一列是双引号。
我可以通过指定astype
来跳过上一个dtype
:np.array(data.tolist(),dtype=str)
更好的是,告诉genfromtxt
:
np.genfromtxt('stack39872346.txt',delimiter=',',dtype=str)
原始复合dtype的一个好处是您可以将数字字段作为数字访问:
In [214]: data['f1']
Out[214]: array([ 3000., 3650., 3000.])
In [215]: Dataset1[:,1]
Out[215]:
array(['3000.0', '3650.0', '3000.0'],
dtype='<U6')
我还没有解决双引号问题。 csv
读者可以删除那些; genfromtxt
没有。虽然幸运的是你在引号中没有分隔符,所以我可以写一个converter
,在genfromtxt
读取期间将其删除。
=================
def foo(astr):
return astr[1:-1] # crude dequote
In [223]: data=np.genfromtxt('stack39872346.txt',delimiter=',',
dtype='U6,float,int', converters={0:foo})
In [224]: data
Out[224]:
array([('fabc', 3000.0, 1),
('fdef', 3650.0, 1),
('ghi', 3000.0, 2)],
dtype=[('f0', '<U6'), ('f1', '<f8'), ('f2', '<i4')])
In [225]: np.array(data.tolist())
Out[225]:
array([['fabc', '3000.0', '1'],
['fdef', '3650.0', '1'],
['ghi', '3000.0', '2']],
dtype='<U6')
在加载converter
时,我似乎必须使用复合dtype。