python - 有效地获得 3 个不同大小和类型的 numpy 数组的排列
问题描述
我有 3 个任意大小和类型的 numpy 数组,如下所示:
时间 (datetime)、lats (float64)、longs (float64)
import numpy as np
import pandas as pd
time = np.asarray(['2018-05-01T00:30:00.000000000','2018-05-01T01:30:00.000000000','2018-05-01T02:30:00.000000000', '2018-05-01T03:30:00.000000000'], dtype='<M8[ns]')
lats = np.asarray([-90. , -89.5, -89. , -88.5, -88. , -87.5, -87. , -86.5, -86. ,-85.5])
longs = np.asarray([-180., -179.3, -178.7 , -178.1, -177.5 , -176.8, -176.2 , -175.6, -175., -174.3, -173.7 , -173.1 ,-172.5 , -171.8, -171.2 , -170.6, -170., -169.3])
以及 1 个数组,其中包含与三个数组的扁平化和有序排列相对应的值,其长度为:
length = len(time)*len(lats)*len(longs)
values = np.asarray(range(length), dtype='float64')
这里的值是任意的,但索引很重要。我正在寻求构建一个扁平的数据集,该数据集包含所有按时间排序的数据,lats,longs - 按此顺序,因为每个 lat 应该有 len(longs) 值。以下是我的工作代码:
master = pd.DataFrame(np.array(np.meshgrid(time, longs, lats)).T.reshape(-1,3), columns = ['datetime', 'long', 'lat'])
master['values'] = values
print master.head()
虽然这工作正常,但我必须将 datetime 列转换回时间戳:
master['datetime'] = master['datetime'].apply(pd.to_datetime)
print master
这个重塑数据、展平数据、然后在类型之间转换的过程太慢了,而且计算负载很高。有没有更有效的方法来实现我想要的数据结构?
解决方案
您可以通过使用 MultiIndex.from_product 避免许多低级 numpy 操作,并且它的优点是您不会丢失类型信息。这绕过了非常慢的 pd.to_datetime 调用。例如:
time = pd.date_range("2018-05-01", freq="30min", periods=24).values
lats = np.linspace(-90, -80, 1000)
longs = np.linspace(-180, -170, 1000)
length = len(time)*len(lats)*len(longs)
values = np.arange(length, dtype='float64')
它给出了 24 M 的长度,然后:
进而
In [48]: %time df = pd.Series(values,
index=pd.MultiIndex.from_product([time, lats, longs],
names=["datetime", "lat", "long"])).reset_index(name='values')
Wall time: 1.38 s
In [49]: df.head()
Out[49]:
datetime lat long values
0 2018-05-01 -90.0 -180.00000 0.0
1 2018-05-01 -90.0 -179.98999 1.0
2 2018-05-01 -90.0 -179.97998 2.0
3 2018-05-01 -90.0 -179.96997 3.0
4 2018-05-01 -90.0 -179.95996 4.0
推荐阅读
- java - 如何在java中添加超时和轮询代码?
- python - 错误:“[文件]...”的值无效:路径“{path/to/data}”不存在
- angularjs - 错误:模板解析错误:'super-tab-button' 不是 ionic 3 中的已知元素
- javascript - 我想检查用户是否在 React 应用程序中在线?
- c# - Unity ADS 对象引用未设置为对象错误的实例
- mysql - 无法卸载 mysql-server-8.0
- php - 将使用 PHP 中的条件开发的查询转换为存储过程
- jsp - JSP 上下文根显示空页面
- sapb1 - SAP B1 中的自定义选项卡内容不变
- swift - 设置日期和时间不显示在 textField / Swift