如何从100×100二维NumPy数组的内部区域随机采样并保留原扁平化索引
解决方案
我明白你的需求了——要在保留原100×100数组结构的前提下,从中间80×80区域随机采样250个元素,并得到这些元素在扁平化数组中的一维索引。这里有个直接可行的实现方案:
步骤说明
- 确认中间区域范围:你已经通过
row_idx和col_idx定义了中间区域的行(10到89)和列(10到89),这部分是正确的——np.arange(min_select, max_select)是左闭右开区间,正好覆盖80个连续索引,完美对应你要排除边缘后的内部区域。 - 生成随机二维坐标:从中间区域的行、列索引池中,分别随机挑选250个值,组成一组组二维坐标对。
- 转换为扁平化索引:用NumPy的
np.ravel_multi_index函数,把这些二维坐标转换成原数组扁平化后的一维索引,这个函数会自动匹配数组的行优先存储顺序,和flatten()/ravel()的结果完全一致。
完整代码补全
import numpy as np gridsize = 100 new_abundances = np.zeros([100,100],dtype=np.uint8) min_select = int(np.around(gridsize * 0.10)) max_select = int(gridsize - (np.around(gridsize * 0.10))) row_idx = np.arange(min_select, max_select) col_idx = np.arange(min_select, max_select) # 定义需要采样的数量 num_samples = 250 # 从中间区域随机选择行和列坐标(允许重复采样,若要禁止重复可设replace=False) random_rows = np.random.choice(row_idx, size=num_samples, replace=True) random_cols = np.random.choice(col_idx, size=num_samples, replace=True) # 将二维坐标转换为扁平化后的一维索引 indices_random = np.ravel_multi_index((random_rows, random_cols), dims=(gridsize, gridsize))
关键细节解释
- 保留原数组结构:整个过程没有裁剪
new_abundances,始终基于原100×100网格的索引操作,完全适配你多轮迭代中识别边缘的需求。 - 索引转换准确性:
np.ravel_multi_index会根据dims=(100,100)准确计算位置,比如原数组中(10,10)的位置,扁平化后的索引是10*100 + 10 = 1010,和直接调用new_abundances.flatten()[1010]的结果完全对应。 - 采样重复控制:如果需要不重复采样,只需把
np.random.choice的replace参数改为False——中间区域共有80×80=6400个元素,远大于250,完全不用担心采样数量不足的问题。
内容的提问来源于stack exchange,提问作者ECM
相关产品推荐
相关产品推荐

