2017-08-10 92 views
0

我需要一些幫助來創建一個腳本來自動計算「pn」。如何自動計算「pn」?

現在我有這樣的代碼:

import numpy as np 
from itertools import product 


a=np.arange(1,4,1) 
po= [] 
po = list(product(a, repeat =2)) 
array1= np.array(po) 
array2= np.array([[2,40],[3,40],[4,43]]) 
p1=array1[0,0]*array2[:,1:]**array1[0,1] 
p2=array1[1,0]*array2[:,1:]**array1[1,1] 
p3=array1[2,0]*array2[:,1:]**array1[2,1] 

array1代表有序對和array2代表深度的一些值。

的公式爲pn = array1(first element of pn line)*array2(the second column)**array1(second element of pn line)

我該如何解決呢?我怎樣才能自動計算所有p? 非常感謝。

+0

對不起。值不正確 –

+0

是的。對不起,再次不正確。 –

回答

0

創建一個變量,n,並且其中所述陣列索引需要改變使用它。我把它放在一個函數調用方便,不得不從n個減1,因爲數組從0開始。

def calculate_pn(n): 
    pn = array1[n-1,0]*array2[:,n-1:]**array1[n-1,1] 
    return pn 

> calculate_pn(n=1) 
array([[40], 
     [40], 
     [43]], dtype=int32) 

你可以用一個範圍值調用此計算多個P值。下面我使用dict理解來製作1和array1中元素數量之間的p值查找表。

> p = { n:calculate_pn(n) for n in range(1, len(array1)) } 
> p[1] 
array([[ 2, 40], 
     [ 3, 40], 
     [ 4, 43]], dtype=int32) 

(您可能希望編輯calculate_pn接受數組1和數組2的參數也一樣)

+0

這是很好的解決方案,但我需要所有的值自動...例如:在這種情況下,數組1的形狀是(9x2),我需要所有的9「p」自動 –

+0

請參閱我的編輯詞典理解。 –

+0

非常感謝! –

1

你可以計算所有的pii = 1,...,n一次全部:

ps = (array1[:, 0] * (array2[:, 1:]**array1[:, 1])).T[..., None] 

其中

p1 equals ps[0], 
p2 equals ps[1], 
... 

pn equals ps[n-1] 

例如,

import numpy as np 
from itertools import product 

a = np.arange(1, 4, 1) 
po = [] 
po = list(product(a, repeat=2)) 
array1 = np.array(po) 
array2 = np.array([[2, 40], [3, 40], [4, 43]]) 
p1 = array1[0, 0] * array2[:, 1:]**array1[0, 1] 
p2 = array1[1, 0] * array2[:, 1:]**array1[1, 1] 
p3 = array1[2, 0] * array2[:, 1:]**array1[2, 1] 

ps = (array1[:, 0] * (array2[:, 1:]**array1[:, 1])).T[..., None] 

assert np.allclose(p1, ps[0]) 
assert np.allclose(p2, ps[1]) 
assert np.allclose(p3, ps[2]) 

此表達通過考慮部件陣列的形狀找到。

In [294]: array2[:, 1:].shape 
Out[294]: (3, 1) 

In [295]: array1[:, 1].shape 
Out[295]: (9,) 

Broadcasting允許我們計算(array2[:, 1:]**array1[:, 1]),產生形狀的陣列(3,9):

In [296]: (array2[:, 1:]**array1[:, 1]).shape 
Out[296]: (3, 9) 

由於array1[:, 0]是形狀的一維陣列(9):

In [297]: array1[:, 0].shape 
Out[297]: (9,) 

我們可以再次使用廣播相乘兩個在一起,從而導致形狀的陣列(3,9):

In [299]: (array1[:, 0] * (array2[:, 1:]**array1[:, 1])).shape 
Out[299]: (3, 9) 

因爲我們想p1成爲ps[0],和p2成爲ps[1],依此類推, 我們希望長度9的尺寸爲所述第一軸線。所以轉:

In [300]: (array1[:, 0] * (array2[:, 1:]**array1[:, 1])).T.shape 
Out[300]: (9, 3) 

而且由於p1已經塑造(3, 1)而不只是(3,),我們需要另一個維度添加到結果。這是通過[..., None]索引的目的。

In [304]: (array1[:, 0] * (array2[:, 1:]**array1[:, 1])).T[..., None].shape 
Out[304]: (9, 3, 1)