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

にないの要素を単純にマスクして更新するには、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)のサイズは、が にある場合にのみ真になります。これを逆にします。aia[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))

これは、 toを渡す代わりに、toの要素ではなくインデックスを与える配列を作成することa[...] = ...を除いて、この回答の最初の部分の割り当てに似ています。anp.in1dnp.arangeanp.in1d

于 2013-05-15T16:39:32.013 に答える
4

乱数の生成を倹約するよりも (特にbが小さなリストの場合)、 size のランダムな配列を生成してから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 に答える