2017-10-09 11 views
-1

我有一個3d np.array x,其中x.shape == (r, n, m)如何有效地乘以每個子陣列單獨的3d np.array的第一維,Python 3

這意味着單獨的尺寸r,每個元素是一個二維數組n-by-m。 對於每個2d陣列,我想乘以一個向量。

這是一個例子。

import bumpy as np 
x = np.array([[[1, 2, 3, 4], 
       [4, 5, 6, 7], 
       [7, 8, 9, 10]], 
       [[4, 5, 6, 7], 
       [7, 8, 9, 10], 
       [10, 11, 12, 13]], 
       [[7, 8, 9, 10], 
       [10, 11, 12, 13], 
       [13, 14, 15, 16]]]) 

所以x.shape(r=3, n=3, m=4)。單獨的第一尺寸有三個二維陣列

r1 = [[1, 2, 3, 4], 
     [4, 5, 6, 7], 
     [7, 8, 9, 10]] 

r2 = [[4, 5, 6, 7], 
     [7, 8, 9, 10], 
     [10, 11, 12, 13]] 

r3 = [[7, 8, 9, 10], 
     [10, 11, 12, 13], 
     [13, 14, 15, 16]]] 

對於每個二維陣列,我要完成相同的操作:在第一行是由k**(n-1)相乘,第二行是通過k**(n-2)相乘,等等。最後一行乘以k**(n-n)

採取r1例如:

k = 0.9 
n = 3 
r1_operated = np.empty_like(r1) 
r1_operated[0] = r1[0] * k**(n-1) # n = 3, so (n-1) = 2 
r1_operated[1] = r1[1] * k**(n-2) # n = 3, so (n-2) = 1 
r1_operated[1] = r1[2] * k**(n-n) # n = 3, so (n-n) = 0 

上面我所編寫的是醜陋的,並且可以很粗短如果rn是非常大的。

你知道任何優雅和有效的方法來編碼這種算法嗎?

我正在使用Python3。謝謝!

回答

1

利用numpy.broadcasting

x * (k ** np.arange(x.shape[1]-1, -1, -1))[:,None] 

x * (k ** np.arange(x.shape[1]-1, -1, -1))[:,None] 

#array([[[ 0.81, 1.62, 2.43, 3.24], 
#  [ 3.6 , 4.5 , 5.4 , 6.3 ], 
#  [ 7. , 8. , 9. , 10. ]], 

#  [[ 3.24, 4.05, 4.86, 5.67], 
#  [ 6.3 , 7.2 , 8.1 , 9. ], 
#  [ 10. , 11. , 12. , 13. ]], 

#  [[ 5.67, 6.48, 7.29, 8.1 ], 
#  [ 9. , 9.9 , 10.8 , 11.7 ], 
#  [ 13. , 14. , 15. , 16. ]]]) 

對於比較:

def by_element(r): 
    k = 0.9 
    n = 3 
    r1_operated = np.empty_like(r1, dtype=np.float) 
    r1_operated[0] = r[0] * k**(n-1) # n = 3, so (n-1) = 2 
    r1_operated[1] = r[1] * k**(n-2) # n = 3, so (n-2) = 1 
    r1_operated[2] = r[2] * k**(n-n) 
    return r1_operated 

by_element(x[0]) 
#array([[ 0.81, 1.62, 2.43, 3.24], 
#  [ 3.6 , 4.5 , 5.4 , 6.3 ], 
#  [ 7. , 8. , 9. , 10. ]]) 

by_element(x[1]) 
#array([[ 3.24, 4.05, 4.86, 5.67], 
#  [ 6.3 , 7.2 , 8.1 , 9. ], 
#  [ 10. , 11. , 12. , 13. ]]) 

by_element(x[2]) 
#array([[ 5.67, 6.48, 7.29, 8.1 ], 
#  [ 9. , 9.9 , 10.8 , 11.7 ], 
#  [ 13. , 14. , 15. , 16. ]]) 
+1

優秀!謝謝! – aura

相關問題