2011-05-26 66 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