你可以計算所有的pi
爲i = 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)
對不起。值不正確 –
是的。對不起,再次不正確。 –