我遍历3D numpy数组,并希望在每个步骤中在第3维(轴= 2)处将浮点值附加到该数组。有点像(我知道代码到目前为止还不起作用,latIndex, data
和lonIndex
为简单起见是随机的)
import numpy as np
import random
GridData = np.ones((121, 201, 1000))
data = np.random.rand(4800, 4800)
for row in range(4800):
for column in range(4800):
latIndex = random.randrange(0, 121, 1)
lonIndex = random.randrange(0, 201, 1)
GridData = np.append(GridData[latIndex, lonIndex, :], data[column, row], axis = 2)
GridData
的三维尺寸在大小为1000的示例中是任意的。我该如何实现?
添加:没有np.append
可能是可能的,但是我不知道该怎么做,因为latIndex
和lonIndex
的每种组合的第三个索引都不同。
您可以为数组grid_data
分配额外的空间,用NaN填充它,并在迭代并填充data
中的值时跟踪要在另一个数组中填充的下一个索引。如果您用非NaN值完全填充了某些lat_idx, lon_idx
的三维尺寸,则只需分配更多空间。由于使用numpy
进行附加操作非常昂贵,因此最好使该额外空间很大,因此您只需执行一次或两次(在下面我分配了原始空间的两倍)。
一旦数组被填充,您可以删除numpy.isnan()
未使用的添加空间。此解决方案可以完成您想要的操作,但速度非常慢(对于您提供的示例值来说,它花费了大约两分钟的时间),但是执行速度较慢的原因是迭代而不是numpy
操作。
这里是代码:
import random
import numpy as np
grid_data = np.ones(shape=(121, 201, 1000))
data = np.random.rand(4800, 4800)
# keep track of next index to fill for all the arrays in axis 2
next_to_fill = np.full(shape=(grid_data.shape[0], grid_data.shape[1]),
fill_value=grid_data.shape[2],
dtype=np.int32)
# allocate more space
double_shape = (grid_data.shape[0], grid_data.shape[1], grid_data.shape[2] * 2)
extra_space = np.full(shape=double_shape, fill_value=np.nan)
grid_data = np.append(grid_data, extra_space, axis=2)
for row in range(4800):
for col in range(4800):
lat_idx = random.randint(0, 120)
lon_idx = random.randint(0, 200)
# allocate more space if needed
if next_to_fill[lat_idx, lon_idx] >= grid_data.shape[2]:
grid_data = np.append(grid_data, extra_space, axis=2)
grid_data[lat_idx, lon_idx, next_to_fill[lat_idx, lon_idx]] = data[row,
col]
next_to_fill[lat_idx, lon_idx] += 1
# remove unnecessary nans that were appended
not_all_nan_idxs = ~np.isnan(grid_data).all(axis=(0, 1))
grid_data = grid_data[:, :, not_all_nan_idxs]