python - float 的结构化数组和 float 数组的整数

标签 python numpy scipy

我正在导入一个 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,它是数组第二个位置的整数值,包含到 latlonllarray 中。为了便于计算,我希望 llarray 是一个包含 3 列的二维 float 组,而不是将其设为另一个结构化数组。

但是,当我尝试以下操作时,只将 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

关于python - float 的结构化数组和 float 数组的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258454/

相关文章:

python - 谁能解释如何使用OpenCV在Raspberry Pi上从kinect保存RGB图像?

python - 如何使用 Python 将每个月的常数乘以原始时间序列

python - 如何检查矩阵中的行是否有重复项?

python - 按 Numpy 的中位数分组(不含 Pandas)

python - 仅替换完全匹配的字符串 python ndarray

python - Scipy.optimization 线性函数逼近

没有参数的 Python setter?

python - 在 DBSCAN 中使用 Mahalanobis 等替代距离度量

python - 针对许多不同的开始/结束值计算排序数组中的项目数的有效方法

python - 矩阵乘法的子集,快速且稀疏