С парой выборочных массивов (вы должны были предоставить их):
In [196]: a = np.arange(1,4); M = np.arange(1,10).reshape(3,3)
In [197]: a
Out[197]: array([1, 2, 3])
In [198]: M
Out[198]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [199]: d = 2 * M/(a[:,None]+a[None,:])
In [200]: d
Out[200]:
array([[1. , 1.33333333, 1.5 ],
[2.66666667, 2.5 , 2.4 ],
[3.5 , 3.2 , 3. ]])
a[None,:]
можно было бы упростить до a
, но я хотел уточнить использование вещания для вычисления этого внешнего товар. В numpy есть различные инструменты для этого. Мне нравится индексирование None
, потому что оно простое и идиоматическое c.
тестирование на ваш код (опять же, вы должны были предоставить такой результат):
In [202]: def foo(a):
...: d = np.zeros((3,3))
...: for i in range(len(a)):
...: x = a[i]
...: for j in range(len(a)):
...: y = a[j]
...: z = M[i][j]
...: d[i][j] = 2 * z/(y+x)
...: return d
...:
In [203]: foo(a)
Out[203]:
array([[1. , 1.33333333, 1.5 ],
[2.66666667, 2.5 , 2.4 ],
[3.5 , 3.2 , 3. ]])