我正在导入csv文件
data = np.genfromtxt('na.csv', delimiter=",", dtype=[('latitude', 'f8'), ('longitude', 'f8'), ('location_id','i4'), ('location_name', 'S60'), ('location_group_id', 'i4'), ('location_group_name', 'S32')])
并逐个考虑location_group_ids的行。
l_g_id_set = set()
l_g_id_set.update(data['location_group_id'])
for lgid in l_g_id_set:
# rows with location group id == lgid
group = data[data['location_group_id']==lgid]
到目前为止,我只包括纬度和经度,它们是来自csv文件的结构化数组的第0和第1位置的两个浮点值。
# structured array of latitude-longitude
latlon = group[list(group.dtype.names[:2])]
# convert the structured array into numpy array of floats
llarray = latlon.view((float, len(latlon.dtype.names)))
现在我想将location_id(数组的第二个位置的整数值)包含到latlon
和llarray
。我想要llarray
一个包含3列的2D浮点数组,而不是制作另一个结构化数组。
但是,当我尝试以下操作时,只更改2到3
# structured array of latitude-longitude
latlon = group[list(group.dtype.names[:3])]
# convert the structured array into numpy array of floats
llarray = latlon.view((float, len(latlon.dtype.names)))
失败,抛出以下错误。
llarray = latlon.view((float, len(latlon.dtype.names)))
ValueError: new type not compatible with array.
我该如何解决这个问题,为什么我的修复失败?
答案 0 :(得分:1)
此转换有效
dtype1=[('latitude', 'f8'), ('longitude', 'f8'), ('location_id', 'f4')]
data1=data[list(data.dtype.names[:3])].astype(dtype1)
但是data1.view(float)
仍然会出错
dtype2=[('latitude', 'f8'), ('longitude', 'f8'), ('location_id', 'f8')]
data2=data[list(data.dtype.names[:3])].astype(dtype2)
data2.view(float).reshape(-1,3)
data2.view((float,3)) # equivalent view
没问题。
示例数据:
In [211]: data[:3]
Out[211]:
array([(1.2, 2.3, 100, 'testing', 45, 'another'),
(1.2, 2.3, 200, 'testings', 45, 'xxx'),
(1.2, 2.3343, 300, 'testings', 45, 'xxx')],
dtype=[('latitude', '<f8'), ('longitude', '<f8'), ('location_id', '<i4'), ('location_name', 'S60'), ('location_group_id', '<i4'), ('location_group_name', 'S32')])
In [212]: data2[:3].view(np.float).reshape(-1,3)
Out[212]:
array([[ 1.2 , 2.3 , 100. ],
[ 1.2 , 2.3 , 200. ],
[ 1.2 , 2.3343, 300. ]])
In [230]: data2.view(np.float).reshape(-1,3).max(axis=0)
Out[230]: array([ 1.2 , 2.3343, 300. ])
In [234]: data2['longitude'].max()
Out[234]: 2.3342999999999998
In [236]: data2.view(np.float).reshape(-1,3)[:,1].max()
Out[236]: 2.3342999999999998
答案 1 :(得分:0)
嗯。也许你会幸运的。
f_latlon = latlon.astype(np.float)