структурированный массив float и int в массив float

Я импортирую файл 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] 

До сих пор я включал только широту и долготу, которые являются двумя значениями float в 0-й и 1-й позиции структурированного массива из файла csv.

  # 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, который является целочисленным значением во 2-й позиции массива, в latlon и llarray . Вместо того, чтобы делать этот другой структурированный массив, я бы хотел, чтобы llarray собой 2D-массив с 3-мя столбцами для удобства вычисления.

Однако, когда я пытаюсь сделать следующее, изменяя только 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. 

Как я могу это исправить, и почему мое исправление не работает?

Эта трансформация работает

 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 

Хм. Возможно, вам повезет с этим.

 f_latlon = latlon.astype(np.float)