将值附加到3D数组numpy

问题描述 投票:1回答:1

我遍历3D numpy数组,并希望在每个步骤中在第3维(轴= 2)处将浮点值附加到该数组。有点像(我知道代码到目前为止还不起作用,latIndex, datalonIndex为简单起见是随机的)

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可能是可能的,但是我不知道该怎么做,因为latIndexlonIndex的每种组合的第三个索引都不同。

python arrays numpy append
1个回答
0
投票

您可以为数组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]
© www.soinside.com 2019 - 2024. All rights reserved.