2013-05-13 85 views
5

我已經陣列看起來像這樣,例如:的Python numpy的陣列替換

array([[ 1, 1, 2, 0, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 0, 0, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 0, 24], 
     [25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49]]) 

我有另外兩個陣列,其是這樣的:

array([[ 0, 0, 0, 0], 
     [ 0, 0, 0, 0], 
     [ 0, 2891, 0, 0], 
     [ 0, 0, 0, 0], 
     [ 0, 0, 0, 2891]]) 

array([[ 0, 0, 0, 643], 
     [ 0, 0, 0, 0], 
     [ 0, 0, 643, 0], 
     [ 0, 0, 0, 0], 
     [ 0, 0, 0, 0]]) 

什麼我想要的是從第二個數組中選擇值2891到相應位置的第一個數組,也從第三個數組中選擇643到fir第一陣列中的對應位置,以使陣列天線的最終應該是這樣的:

array([[ 1, 1, 2, 643, 4], 
     [ 5, 6, 7, 8, 9], 
     [ 10, 2891, 643, 13, 14], 
     [ 15, 16, 17, 18, 19], 
     [ 20, 21, 22, 2891, 24], 
     [ 25, 26, 27, 28, 29], 
     [ 30, 31, 32, 33, 34], 
     [ 35, 36, 37, 38, 39], 
     [ 40, 41, 42, 43, 44], 
     [ 45, 46, 47, 48, 49]]) 

到目前爲止我曾嘗試此命令:

np.place(a,a<1, np.amax(b)) 

其中a稱爲第一陣列和b提到的第二陣列。它只是用2891的值代替所有的0值。有人可以幫忙嗎?

回答

5

你可以找到在哪裏yz是非零使用非零方法的指數:

In [9]: y.nonzero() 
Out[9]: (array([2, 4]), array([1, 3])) 

In [10]: z.nonzero() 
Out[10]: (array([0, 2]), array([3, 2])) 

您可以選擇關聯值throug^h fancing indexing

In [11]: y[y.nonzero()] 
Out[11]: array([2891, 2891]) 

,您可以在x

In [13]: x[y.nonzero()] = y[y.nonzero()] 

import numpy as np 
x = np.array([[ 1, 1, 2, 0, 4], 
       [ 5, 6, 7, 8, 9], 
       [10, 0, 0, 13, 14], 
       [15, 16, 17, 18, 19], 
       [20, 21, 22, 0, 24], 
       [25, 26, 27, 28, 29], 
       [30, 31, 32, 33, 34], 
       [35, 36, 37, 38, 39], 
       [40, 41, 42, 43, 44], 
       [45, 46, 47, 48, 49]]) 

y = np.array([[ 0, 0, 0, 0], 
       [ 0, 0, 0, 0], 
       [ 0, 2891, 0, 0], 
       [ 0, 0, 0, 0], 
       [ 0, 0, 0, 2891]]) 

z = np.array([[ 0, 0, 0, 643], 
       [ 0, 0, 0, 0], 
       [ 0, 0, 643, 0], 
       [ 0, 0, 0, 0], 
       [ 0, 0, 0, 0]]) 

x[y.nonzero()] = y[y.nonzero()] 
x[z.nonzero()] = z[z.nonzero()] 
print(x) 

收益分配這些值的位置

[[ 1 1 2 643 4] 
[ 5 6 7 8 9] 
[ 10 2891 643 13 14] 
[ 15 16 17 18 19] 
[ 20 21 22 2891 24] 
[ 25 26 27 28 29] 
[ 30 31 32 33 34] 
[ 35 36 37 38 39] 
[ 40 41 42 43 44] 
[ 45 46 47 48 49]] 
3

你的意思是從第二個數組和第三個數組中選擇最大值?如果是這樣,請嘗試以下:

初始化數據:

In [48]: arr = array([[ 1, 1, 2, 0, 4], 
    ....: [ 5, 6, 7, 8, 9], 
    ....: [10, 0, 0, 13, 14], 
    ....: [15, 16, 17, 18, 19], 
    ....: [20, 21, 22, 0, 24], 
    ....: [25, 26, 27, 28, 29], 
    ....: [30, 31, 32, 33, 34], 
    ....: [35, 36, 37, 38, 39], 
    ....: [40, 41, 42, 43, 44], 
    ....: [45, 46, 47, 48, 49]]) 

In [49]: arr1 = array([[ 0, 0, 0, 0], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 2891, 0, 0], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 0, 0, 2891]]) 

In [50]: arr2 = array([[ 0, 0, 0, 643], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 0, 643, 0], 
    ....: [ 0, 0, 0, 0], 
    ....: [ 0, 0, 0, 0]]) 

選擇和替換:

In [51]: arr[arr1==arr1.max()] = arr1.max() 

In [52]: arr[arr2==arr2.max()] = arr2.max() 

In [53]: arr 
Out[53]: 
array([[ 1, 1, 2, 643, 4], 
     [ 5, 6, 7, 8, 9], 
     [ 10, 2891, 643, 13, 14], 
     [ 15, 16, 17, 18, 19], 
     [ 20, 21, 22, 2891, 24], 
     [ 25, 26, 27, 28, 29], 
     [ 30, 31, 32, 33, 34], 
     [ 35, 36, 37, 38, 39], 
     [ 40, 41, 42, 43, 44], 
     [ 45, 46, 47, 48, 49]]) 
+1

可能更快存儲'arr1.max()'/'arr2.max' – jamylak 2013-05-13 11:55:30

+0

thnax你的答案。我理解了第二個答案的解釋,那就是爲什麼我接受這個答案。但你的工作也是如此。 – user2095624 2013-05-13 12:09:09

+0

小心我們的答案有一些差異。我選擇最大值並替換它們,同時選擇非零值,然後替換它們。如果第二個或第三個數組中有兩種非零數字,則輸出將不同。 – waitingkuo 2013-05-13 12:18:33

0

在numpy的,你可以在陌生的下標陣列 方法。 1.用布爾數組2.指數

a1[a2 > 0] = a2[a2.nonzero()]