如何替换NumPy ndarray中的第n个指定元素实例?
解决NumPy数组中替换第n个指定元素实例的问题
首先,你之前尝试的 atoms.numbers[atoms.numbers==57][::n]=38 无法生效的核心原因是:NumPy通过布尔索引返回的是原数组的副本,而非视图。你修改的只是这个临时副本里的元素,原数组根本不会受到影响。
要实现替换第n个指定元素(或每第n个元素),关键是先定位到原数组中这些元素的真实索引,再直接修改原数组本身。下面分两种场景给出具体方案:
场景1:替换单个第n个指定元素实例
比如你要替换第5个值为57的元素(注意:如果是从1开始计数,第5个对应的索引是4;如果习惯从0开始计数,直接用n即可),步骤如下:
- 先获取所有值为57的元素在原数组中的索引:
import numpy as np # 假设atoms.numbers是你的目标NumPy数组 indices = np.where(atoms.numbers == 57)[0]
np.where 会返回一个元组,第一个元素就是符合条件的索引数组。
- 检查n的有效性(确保n不超过目标元素的总数),再修改原数组:
n = 5 # 这里以替换第5个实例(从1开始计数)为例 if n <= len(indices): atoms.numbers[indices[n-1]] = 38 # 因为数组索引从0开始,所以要减1 else: print("指定的n超过了目标元素的总数量,请检查")
场景2:替换每第n个指定元素实例
如果你想每隔n个目标元素就替换一个(比如第n、2n、3n...个实例),可以通过切片选取索引数组,再批量修改:
n = 5 indices = np.where(atoms.numbers == 57)[0] # 选取每第n个元素的索引(从第n个开始,步长为n) target_indices = indices[n-1::n] # 从1开始计数用n-1,从0开始直接用n atoms.numbers[target_indices] = 38
拿你的示例数组测试的话,原数组中有16个值为57的元素,执行以上代码后,第5、10、15个57都会被替换成38,修改会直接作用在原数组上。
内容的提问来源于stack exchange,提问作者Dallon Penney
相关产品推荐
相关产品推荐

