2016-11-27 62 views
2

所以,我有一個目標numpy的陣列,說由條件獲取到numpy的數組元素的引用

a = np.array([3, 7, 9, 3, 5]) 

和我有一個條件陣列,例如

c = np.array([False, False, True, True, False]) 

,我想通過c

>>> b 
array([9,3]) 

使得如果我改變它,a也改變以獲得陣列b,指定。例如:

>>> b[0]=2 
>>> b 
array([2,3]) 
>>> a 
array([3, 7, 2, 3, 5]) 

我已經試過類似的東西:

>>> b = np.compress(c,a) 
>>> b 
array([9, 3]) 
>>> b[0]=2 
>>> b 
array([2, 3]) 
>>> a 
array([3, 7, 9, 3, 5]) 

但它不工作,a仍然是相同的,np.compress()返回一個副本。此外,我有這個代碼沒有成功:

b=a[np.where(c)] 

是否有返回參考,不可複製的np.compress()任何模擬? 謝謝!

+1

'b'永遠是副本;從來沒有看法。蒙版陣列可能是「即時」應用蒙版的最佳方式。 – hpaulj

回答

2

一兩件事,大概可以適應您的需求是numpy「屏蔽」:

>>> import numpy as np 
>>> a = np.array([3,7, 9, 3, 5]) 
>>> c = np.array([False, False, True, True, False]) 
>>> b = np.ma.array(a,mask=~c) 

注意我不得不採取的c的元素單元的否定:~c,因爲True將被解釋爲「這個元素應該被屏蔽「你想要相反 - 這個元素應該被揭露。注意,現在b行爲,當你做就可以怎麼操作你想要的:

>>> b 
masked_array(data = [-- -- 9 3 --], 
      mask = [ True True False False True], 
     fill_value = 999999) 
>>> b.sum() 
12 
>>> (2*b) 
masked_array(data = [-- -- 18 6 --], 
      mask = [ True True False False True], 
     fill_value = 999999) 

>>> (2*b).sum() 

而且,它正在開發的a視圖,因此更改a改變b

>>> a 
array([3, 7, 9, 3, 5]) 
>>> a[2] = 42 
>>> a 
array([ 3, 7, 42, 3, 5]) 
>>> b 
masked_array(data = [-- -- 42 3 --], 
      mask = [ True True False False True], 
     fill_value = 999999) 

>>> b.sum() 
45 

相反還工作,雖然,指數並沒有改變:

>>> b[2] = 88 
>>> a 
array([ 3, 7, 88, 3, 5]) 
>>> b 
masked_array(data = [-- -- 88 3 --], 
      mask = [ True True False False True], 
     fill_value = 999999) 

>>> 

不幸的是,蟒蛇是比較高的水平,所以worki原始引用不是直接的。

相關問題