You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于另一数组修改Python数组列值的高效NumPy实现求助

高效替换NumPy数组中对应坐标的温度值

给定两个NumPy数组,其中arr_2的坐标(前两列)是arr_1的子集,具体如下:

import numpy as np

arr_1 = np.array([[2,5,25],
                  [2,6,28],
                  [7,6,75],
                  [8,4,39],
                  [3,1,86],
                  [1,4,45],
                  [6,5,89],
                  [3,4,99]])

arr_2 = np.array([[7,6,28],
                  [8,4,65],
                  [1,4,22],
                  [6,5,33]])

需求是:根据arr_2的(x,y)坐标(前两列),替换arr_1中对应位置的第三列(温度值),得到目标数组new_arr:

new_arr = np.array([[2,5,25],
                    [2,6,28],
                    [7,6,28],    # arr_1中的75替换为28
                    [8,4,65],    # arr_1中的39替换为65
                    [3,1,86],
                    [1,4,22],    # arr_1中的45替换为22 
                    [6,5,33],    # arr_1中的89替换为33
                    [3,4,99]])

原代码因嵌套循环导致大数据集下效率极低:

for i in range(len(self.dataset[key])):   
    ind = (np.array(self.pad["mesh_pos"][i])[:, None] == np.array(self.dataset["mesh_pos"][i])).all(-1).any(-1)
           
    id = np.array((ind==True).nonzero())[0]
    
    for k in range(len(id)):    
        ar[id[k],0] = self.dataset[key][i][0][k]  

    vr.append(ar)

self.dataset[key] = np.stack(vr, axis=0)

高效实现方案

核心思路是利用NumPy的向量化操作,彻底避免嵌套循环,大幅提升处理速度。以下提供两种适配不同场景的方案:

方案1:字典映射法(通用型)

通过将坐标转换为唯一键,构建坐标到温度值的映射,实现批量替换:

# 复制原数组避免修改原始数据
new_arr = arr_1.copy()

# 将(x,y)坐标转换为64位整数作为唯一标识(适用于整数坐标)
# 原理:把两列int32合并为一个int64,等价于 x * 2^32 + y,确保坐标唯一
keys_1 = arr_1[:, :2].view(np.int64).ravel()
keys_2 = arr_2[:, :2].view(np.int64).ravel()

# 构建坐标到温度的映射字典
temp_map = dict(zip(keys_2, arr_2[:, 2]))

# 筛选出arr_1中需要替换的位置
mask = np.isin(keys_1, keys_2)

# 批量替换对应位置的温度值
new_arr[mask, 2] = np.array([temp_map[key] for key in keys_1[mask]])

方案2:纯NumPy排序匹配法(高性能型)

如果坐标可以排序,用np.searchsorted实现纯向量化匹配,效率比字典法更高:

new_arr = arr_1.copy()

# 对两个数组的(x,y)坐标进行排序
sorted_idx_1 = np.lexsort(arr_1[:, :2].T)
sorted_arr_1 = arr_1[sorted_idx_1]
sorted_idx_2 = np.lexsort(arr_2[:, :2].T)
sorted_arr_2 = arr_2[sorted_idx_2]

# 查找x坐标匹配的位置,再验证y坐标是否一致
match_pos = np.searchsorted(sorted_arr_1[:, 0], sorted_arr_2[:, 0], side='left')
match_pos = match_pos[np.equal(sorted_arr_1[match_pos, 1], sorted_arr_2[:, 1])]

# 批量替换温度值
sorted_arr_1[match_pos, 2] = sorted_arr_2[:, 2]

# 恢复原数组的顺序
new_arr = sorted_arr_1[np.argsort(sorted_idx_1)]

方案优势

  • 时间复杂度从原代码的O(n*m)降至O(n log n)或O(n),大数据集下效率提升显著
  • 两种方案适配不同场景:字典法对任意整数坐标友好,纯NumPy法在坐标有序时性能最优

内容的提问来源于stack exchange,提问作者Nikhil Joshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:50:43