Более простой способ работы матрицы с использованием Numpy - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть такой код:

x = 0
for i in range(100):
    for j in range(100):
        x += f[i, 0] * f[0, j]

Здесь f - это двумерный массив.Теперь, есть ли в numpy функция, которую можно использовать для этого без использования циклов for?

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Да, вы можете использовать NumPy's outer().Это в основном проблема внешнего продукта, когда вы просто суммируете элементы полученной матрицы внешнего продукта n * n.Здесь единственными значениями, которые вы используете в своей матрице, являются первая строка и первый столбец.

Итак, все, что вам нужно сделать, это взять внешний продукт первой строки и первого столбца, используя np.outer ( документы ).Это все, что вы делаете в своем алгоритме с помощью вложенных циклов for.

Пример

import numpy as np

f = np.random.randint(1, 9, (3, 3)) # Create a test 3x3 matrix 

col = f[:, 0] # first column enteries [5, 3, 8]
row = f[0, :] # first row enteries [5, 3, 4]
summ = np.sum(np.outer(row, col))

print (f)
print ('The sum is %d' %summ)

#[[5 3 4]
# [3 8 1]
# [8 7 2]]

# The sum is 192

Альтернатива в соответствии с предложением hpaulj is

np.einsum('i,j->', f[:,0], f[0,:])
0 голосов
/ 25 декабря 2018

Вы можете суммировать первый столбец и первый ряд независимо, а затем взять произведение:

res = f[:, 0].sum() * f[0, :].sum()

Вот код, который нужно проверить, чтобы получить то, что вы ожидаете:

np.random.seed(0)

f = np.random.random((100, 100))

x = 0
for i in range(100):
    for j in range(100):
        x += f[i, 0] * f[0,j]

res = f[:, 0].sum() * f[0, :].sum()

assert np.isclose(x, res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...