2013-05-15 46 views
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,掩模= FALSE)和。掩碼[b] =真,但從這一點我不知道如何將我的隨機數分配給只有非掩碼值

+0

我認爲這個問題現在很清楚。 –

回答

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的大小相匹配。

什麼提問者想要的是通過隨機數a指數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[...] = ...分配,除了強似anp.in1dnp.arange用於製造陣列,讓指數,不元素,anp.in1d

+0

而不是'np.logical_not([i in b for i in a])',你可以寫'〜np.in1d(a,b)'。 – DSM

+0

好點,編輯。謝謝! –

+0

你的解決方案似乎是正確的,但我需要一點改變,因此'b'被理解爲索引而不是值的列表。其實我的例子太混亂了,我應該先用'float'填充'a',例如浮點型隨機數,同時保持'b'不變,因爲它是'a'中的索引列表,我希望這些值保持不變。 – user1850133

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] 
+0

你解決了我的例子的特定情況下的問題;我使用numpy.random.random_integers只是有一些數字。在真實情況下,我沒有特別使用numpy.random.random_integers。它可能是任何東西。我的目標是用給定的值填充給定的數組,除了我在另一個變量中指定的索引。 – user1850133

相關問題