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

如何在Python中用NumPy无循环将数组B覆盖到数组A起始位置

嘿,我来帮你搞定这个需求!不用循环把数组B放到A的起始位置,其实有几种方法,我给你一一拆解,包括你提到的numpy.place和numpy.put的具体实现~

最推荐的方法:直接切片赋值

这应该是NumPy里最直观、最高效的方式,完全不需要循环,也不用手动处理掩码或索引:

import numpy as np

A = np.empty((3,3))
A[:] = np.nan
B = np.ones((2,2))

# 直接通过切片覆盖A的起始区域
A[:B.shape[0], :B.shape[1]] = B

运行后就能得到你想要的结果:

array([[ 1.,  1., nan],
       [ 1.,  1., nan],
       [nan, nan, nan]])

这个方法的核心是利用NumPy的数组切片特性,直接选中A中与B形状匹配的左上角区域,然后把B的值赋值过去,一步到位,代码简洁又高效。


用numpy.place实现

如果一定要用place方法,你需要先创建一个掩码数组,标记出A中需要替换的位置(也就是前2行前2列),然后把B展平成一维数组传入:

import numpy as np

A = np.empty((3,3))
A[:] = np.nan
B = np.ones((2,2))

# 创建掩码:前2行前2列为True,其余为False
mask = np.zeros_like(A, dtype=bool)
mask[:2, :2] = True

# 用place替换,注意B需要展平
np.place(A, mask, B.flatten())

这里的关键是手动构建掩码,告诉place哪些位置需要被替换,然后把二维的B转成一维数组(因为place要求vals是一维的)。


用numpy.put实现

put方法需要目标位置的线性索引(把二维数组的位置转换成一维的序号),你可以用numpy.ravel_multi_index来生成这些索引:

import numpy as np

A = np.empty((3,3))
A[:] = np.nan
B = np.ones((2,2))

# 生成前2行前2列的二维坐标,转换成线性索引
row_indices = [0, 0, 1, 1]
col_indices = [0, 1, 0, 1]
linear_indices = np.ravel_multi_index((row_indices, col_indices), dims=A.shape)

# 用put替换
np.put(A, linear_indices, B.flatten())

ravel_multi_index会把二维的(row, col)坐标转换成一维的索引值,比如(0,0)对应0,(0,1)对应1,(1,0)对应3,(1,1)对应4(因为A是3x3的数组,行优先)。拿到这些索引后,put就能把展平的B元素放到对应的位置上了。


总结

  • 直接切片赋值是最优解,代码简洁且性能最好;
  • place和put虽然能实现需求,但需要额外处理掩码或索引,相对繁琐一些,适合特殊场景下使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:38:10