使用Python更改numpy数组维度

2 投票
2 回答
6681 浏览
提问于 2025-04-18 10:22

我有一组数据,存储在一个数组里。
第一列是 时间,第二列是 纬度,第三列是 经度,第四列是 降水量
举个例子:

2 70 100 5.6 
2 70 110 5.9 
2 80 100 6.2 
2 80 110 5.0 
3 70 100 2.3 
3 70 110 1.1 
3 80 100 0.0 
3 80 110 7.9 

我想把这些数据转换成一个新的数组,新的数组里,y轴代表经度,z轴代表纬度,x轴代表时间。
降水量的数据会放在每一个三维网格的点上。

比如,在下面这张图片中:

在这里输入图片描述
泡泡的大小代表不同的降水量(颜色可以忽略)

我该如何用python来实现这个呢?

到目前为止,我有:

import numpy as np<br>
a=open('time.dat') #original file
b=open('three.dat','w+')
dif=np.fromfile(a) 
tim=dif[:,[0]] 
lat=dif[:,[1]] 
lon=dif[:,[2]] 
pre=dif[:,[3]]
c=np.empty(780,360,720)

780个时间步,360个纬度,720个经度

2 个回答

0

你不能使用numpy的reshape功能,原因很简单:你的原始数组里有重复的数据(比如时间和位置),而你想要的结果里没有这些重复的数据。在进行reshape之前和之后,元素的数量必须是一样的。

你需要用一个循环来读取你最开始的数组,然后把数据填充到新的数组里。

希望这能帮到你。

2

所以你想要一个二维数组,里面的内容包含所有数据,而外面的维度是按照经度、纬度和时间来排序的。

你可以先把文件读成一个值的数组,然后把它转换成一个二维数组,把数据分成每四个一组。接下来,调整内层数组的列顺序。最后,根据内层数组的内容对外层维度进行排序。

>>> data = np.array([2, 70, 100, 5.6, 2, 70, 110, 5.9, 2, 80, 100, 6.2, 2, 80, 110, 5.0, 3, 70, 100, 2.3, 3, 70, 110, 1.1, 3, 80, 100, 0.0, 3, 80, 110, 7.9])
>>> data2 = data.reshape((8, 4))
>>> data2
array([[   2. ,   70. ,  100. ,    5.6],
       [   2. ,   70. ,  110. ,    5.9],
       [   2. ,   80. ,  100. ,    6.2],
       [   2. ,   80. ,  110. ,    5. ],
       [   3. ,   70. ,  100. ,    2.3],
       [   3. ,   70. ,  110. ,    1.1],
       [   3. ,   80. ,  100. ,    0. ],
       [   3. ,   80. ,  110. ,    7.9]])
>>> data2 = data2[:,[1,2,0,3]]
>>> data2
array([[  70. ,  100. ,    2. ,    5.6],
       [  70. ,  110. ,    2. ,    5.9],
       [  80. ,  100. ,    2. ,    6.2],
       [  80. ,  110. ,    2. ,    5. ],
       [  70. ,  100. ,    3. ,    2.3],
       [  70. ,  110. ,    3. ,    1.1],
       [  80. ,  100. ,    3. ,    0. ],
       [  80. ,  110. ,    3. ,    7.9]])

关于视图和排序的奇怪之处,可以在这里找到详细说明。

撰写回答