2011-05-26 23 views
2

我有一個numpy浮點數組,我希望重新計算使用取決於重新計算的列的公式的新值。使用putmask和保存順序替換數組中的列值

我最初嘗試循環遍歷列,屏蔽除重新計算的列之外的數組,並用numpy.putmask替換新值,但這並不保留順序,因爲它試圖放置中的每個元素和失敗,與下一個元件上的下一個計算值嘗試的值,點菜:

>>> import numpy as np 

>>> x = [[ 1., 2.], 
     [ 3., 4.], 
     [ 5., 6.], 
     [ 7., 8.], 
     [ 9., 10.]] 
>>> mask = [[ True, False], 
      [ True, False], 
      [ True, False], 
      [ True, False], 
      [ True, False]] 
>>> y = [ 21., 22., 23., 24., 25.] 
>>> np.putmask(x,mask,y) 
>>> print x 
[[ 21. 2.] 
[ 23. 4.] 
[ 25. 6.] 
[ 22. 8.] 
[ 24. 10.]] 

我需要一種解決方案,將具有相同值的重試,直到它找到一個真值,使得x看起來像:

[[ 21. 2.] 
[ 22. 4.] 
[ 23. 6.] 
[ 24. 8.] 
[ 25. 10.]] 

任何解決方案或其他方法。謝謝。

回答

1

putmask(x,mask,y)集合x.flat[n] = y[n]每個n其中mask.flat[n]爲真。

In [17]: list(x.flat) 
Out[17]: [21.0, 2.0, 22.0, 4.0, 23.0, 6.0, 24.0, 8.0, 25.0, 10.0] 

In [18]: list(mask.flat) 
Out[18]: [True, False, True, False, True, False, True, False, True, False] 

由於mask.flatTrueFalse之間交替,你最終x.flaty每隔值設置所有其他值。

由於yx不一樣大,所以重複y中的值。這是導致(調用 putmask(x,mask,y)x中看到的(不希望的)交替值。

相反地,如果您希望新的值賦給x無論mask爲True, 那麼所有你需要的分配與numpy indexing

x[mask]=y 

例如,

import numpy as np 
x = np.array([[ 1., 2.], 
     [ 3., 4.], 
     [ 5., 6.], 
     [ 7., 8.], 
     [ 9., 10.]]) 
mask = np.array([[ True, False], 
      [ True, False], 
      [ True, False], 
      [ True, False], 
      [ True, False]]) 
y = np.array([ 21., 22., 23., 24., 25.]) 
x[mask]=y 
print(x) 
# [[ 21. 2.] 
# [ 22. 4.] 
# [ 23. 6.] 
# [ 24. 8.] 
# [ 25. 10.]] 
+0

作品正是我想要。非常感謝,並且對於在numpy文獻中使用這種(可能)容易找到的解決方案提出問題表示歉意。 – Jdog 2011-05-27 10:22:47