Python, как избежать l oop с помощью numpy - PullRequest
0 голосов
/ 25 мая 2020

Итак, у меня есть две матрицы, W и X.

print(W)
array([ 5.76951515, 19.        ])

print(X)
array([[ 1.,  5.],
       [ 1.,  6.],
       [ 1.,  7.],
       [ 1.,  8.],
       [ 1.,  9.],
       [ 1., 10.],
       [ 1., 11.],
       [ 1., 12.],
       [ 1., 13.],
       [ 1., 14.]])

, и я бы хотел перемножить обе матрицы W и X, изменяя значение W[1] для каждой i итераций, например:

for i in range(10):
  W[1] = i
  yP_ = W @ X.T
  ecm = np.mean((Y - yP_ ) ** 2)
  plt.plot(W[1], ecm, 'o')
plt.show()

есть ли способ избежать этого for?

Ответы [ 2 ]

2 голосов
/ 25 мая 2020

Попробуйте создать W форму (10,2) и сохранить диапазон 0-9 во втором столбце. Тогда строки продукта W @ X.T являются итерациями вашего текущего for-l oop.

W2 = np.full((10,2), W[0])
W2[:,1] = np.arange(10)
W2
# array([[5.76951515, 0.        ],
#        [5.76951515, 1.        ],
#          ...
#        [5.76951515, 9.        ]])

Таким образом, вы можете сделать

ecm = np.mean((Y - W2 @ X.T)**2, axis=1)  # average across columns
plt.plot(W2[:,1], ecm, 'o')
1 голос
/ 25 мая 2020

Вы можете начать с создания модифицированного массива W, а затем применить матричное произведение так же, как вы, где:

N=10
W_ = np.c_[[W[0]]*N, np.arange(N)]
yP_ = W_@X.T

Быстрая проверка:

yP_ = []
for i in range(N):
    W[1] = i
    yP_.append(W @ X.T)

np.allclose(np.array(yP_), W_@X.T)
# True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...