Skip to main content
 首页 » 编程设计

python之分配数组的所有项目,除了给定索引的项目

2025年05月04日11haluo1

一个例子可以直接说明问题:

import numpy 
 
# ------------------------------------------------------------------------ 
# Edit: 
# commenting out below `a` assignation for the more general case as shown  
#+below this commented block 
# ------------------------------------------------------------------------ 
# a = np.array(range(8)) 
# print a 
# array([0, 1, 2, 3, 4, 5, 6, 7]) 
# ------------------------------------------------------------------------ 
# ------------------------------------------------------------------------ 
 
a = np.random.randn(8) 
print a 
array([-0.53683985, -0.321736  ,  0.15684836,  0.32085469,  1.99615701, 
       -1.16908367, -0.10995894, -1.90925978]) 
b = [4, 7] 
#    ^  ^  These values are indices of values in `a` I want to keep unchanged 
 
# I want to set all values to,  
# say np.random.random_integers(10, 100) or simply `nan` except for indices given by `b`: 
# So I want something like this: 
a[: (!b)] = np.random.random_integers(10, 100)  # I'm using "!" as the NOT operator  
print a 
array([62, 96, 47, 74, 1.99615701, 32, 11, -1.90925978]) 
# not changed:         ^^^^^^^^^^           ^^^^^^^^^^ 
# or: 
a[: (!b)] = np.nan 
print a 
array([nan, nan, nan, nan, 1.99615701, nan, nan, -1.90925978]) 
# not changed:             ^^^^^^^^^^             ^^^^^^^^^^ 

我知道我可以使用 np.ma.array(a, mask = False) 和 a.mask[b] = True,但从这一点上我不知道如何将随机数分配给未屏蔽的值

请您参考如下方法:

简单地屏蔽和更新 a 中不在 b 中的元素,

import numpy as np 
a = np.range(8) 
b = [4, 7] 
a[~np.in1d(a, b)] = np.random.random_integers( 
    10, 100, size=len(a) - len(b)) 
print a 
> array([34, 16, 99, 67,  4, 32, 64,  7]) 

关键是 ~np.in1d(a, b) 结构。 np.in1d(a, b) 生成一个数组,a 的大小使得该数组的项 i 仅当 a[i] 在 b 中; ~ 反转了这一点。

另请注意,传递给 np.random.random_integers 的大小必须与掩码 a 的大小相匹配。

提问者想要的是将 a 中不在 b 中的索引 的随机数传递给 a >。现在,如果您想将随机整数分配给 b 中的元素,您可以简单地执行 a[b] = ...。排除它们更复杂。方法是这样的:

a[~np.in1d(np.arange(np.size(a), b))] = np.random.random_integers( 
                                             10, 100, size=len(a) - len(b)) 

类似于此答案第一部分中的 a[...] = ... 赋值,除了不是将 a 传递给 np.in1d,np.arange 用于生成一个数组,该数组给出 a 到 np.in1d 的索引,而不是元素>.