1

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

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,但是从这一点开始,我不知道如何将我的随机数分配给仅未屏蔽的值

4

2 回答 2

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]
于 2013-05-15T16:31:14.080 回答
4

要简单地屏蔽和更新不在的元素ab

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这样一个项目的大小只有在 ini时才为真;与此相反。a[i]b~

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

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

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

这类似于a[...] = ...此答案第一部分中的分配,除了不是传递ato之外np.in1dnp.arange它用于创建一个数组,该数组给出 to 的索引,而不是a元素np.in1d

于 2013-05-15T16:39:32.013 回答