一个例子将直截了当地说明:
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,但从这一点开始我不知道如何将我的随机数分配给只有未屏蔽的值< / p>
答案 0 :(得分:4)
而不是随机数的生成简约 - 特别是如果b
是一个小列表 - 那么生成一个大小为a.size
的随机数组会更容易,然后复制新数组a
中所需的c
值:
import numpy as np
a = np.array(range(8))
b = [4, 7]
c = np.random.random_integers(10, 100, size=a.size)
c[b] = a[b]
a = c
print(a)
产生类似
的东西[10 92 73 66 4 54 42 7]
答案 1 :(得分:4)
简单地屏蔽和更新不在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
的{{1}}的索引的a
的随机数传递给b
。现在,如果您想为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
的索引而不是元素。