分配除给定索引的数组之外的所有数组项

时间:2013-05-15 16:18:36

标签: python numpy

一个例子将直截了当地说明:

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>

2 个答案:

答案 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用于创建一个数组给anp.in1d的索引而不是元素。