使用Python更改numpy数组维度
我有一组数据,存储在一个数组里。
第一列是 时间
,第二列是 纬度
,第三列是 经度
,第四列是 降水量
。
举个例子:
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]])
关于视图和排序的奇怪之处,可以在这里找到详细说明。