Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有效地获得3个不同大小和类型的numpy数组的排列_Python_Arrays_Pandas_Numpy - Fatal编程技术网

Python 有效地获得3个不同大小和类型的numpy数组的排列

Python 有效地获得3个不同大小和类型的numpy数组的排列,python,arrays,pandas,numpy,Python,Arrays,Pandas,Numpy,我有3个任意大小和类型的numpy数组,如图所示: 时间(日期时间)、lats(浮点64)、longs(浮点64) 这里的值是任意的,但索引很重要。我正在寻求构建一个扁平化的数据集,该数据集保存所有按时间顺序排列的数据,即lat和longs,因为每个lat都应该有len(longs)值。下面是我的工作代码: master = pd.DataFrame(np.array(np.meshgrid(time, longs, lats)).T.reshape(-1,3), columns = ['dat

我有3个任意大小和类型的numpy数组,如图所示:

时间(日期时间)、lats(浮点64)、longs(浮点64)

这里的值是任意的,但索引很重要。我正在寻求构建一个扁平化的数据集,该数据集保存所有按时间顺序排列的数据,即lat和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

您的典型阵列大小是什么样的?只有long/lat会随着时间始终为24而变化,但它可以从10到几百,有时甚至更多。
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')
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