Python,如何避免使用numpy循环

时间:2020-05-25 17:37:06

标签: python numpy loops

所以我有两个矩阵WX

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.]])

我想将矩阵WX都相乘,每次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 个答案:

答案 0 :(得分:2)

尝试使W的形状为(10,2),并在第二列中保持范围0-9。然后,产品W @ X.T的行是当前for循环的迭代。

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 :(得分:1)

您可以首先生成修改后的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