【发布时间】:2018-11-06 09:35:29
【问题描述】:
所以我有一个用 Numpy 创建的向量,称为
V = [10 20 30 40 0 1]
我想要一个像这样的矩阵 M:
[10. 0. 0. 0. 0. 0.]
[20. 10. 0. 0. 0. 0.]
[30. 20. 10. 0. 0. 0.]
[40. 30. 20. 10. 0. 0.]
[ 0. 40. 30. 20. 10. 0.]
[ 1. 0. 40. 30. 20. 10.]
[ 0. 1. 0. 40. 30. 20.]
[ 0. 0. 1. 0. 40. 30.]
[ 0. 0. 0. 1. 0. 40.]
[ 0. 0. 0. 0. 1. 0.]
[ 0. 0. 0. 0. 0. 1.]
为此,我使用 for 循环和向量提取,但它太长了,因为我的向量 V 有 500 列,而矩阵 M 有 500*2 -1 行和 500 列。
此外,对于不同的向量 V,我必须至少重复 100 000 次
是否有可能,使用矩阵计算并避免循环来得到这个结果? (尽可能快)
谢谢!
(我在 Spyder 上使用 Python 3.6)
编辑:我的解决方案:
t=480 n=10000
t1 = time.time()
for p in range(n):
for j in range(M.shape[1]):
M[j:j+t,j] = np.transpose(V[:])
print(time.time()-t1)
14 秒仅 10000 次...太长了
编辑 2:评论中的解决方案基准:
(这里的普拉特是 V)
t1 = time.time()
for p in range(n):
for j in range(M.shape[1]):
M[j:j+t,j] = np.transpose(Prate[:])
print(time.time()-t1)
t1 = time.time()
for p in range(n):
n = len(Prate)
m = np.tile(np.concatenate((np.array(Prate), np.zeros(t))), t)[:2*t*t-t]
result = m.reshape(t, -1).T
print(time.time()-t1)
t1 = time.time()
for p in range(n):
ind = np.arange(t)
indices = ((ind[:,None] + ind).ravel() , np.repeat(ind, t))
base = np.zeros((n1, t))
base[indices] = np.tile(Prate, t)
print(time.time()-t1)
输出:
16.737313747406006
29.46031618118286
3.6843104362487793
编辑 3:为了避免通过两倍于所需大小的数组,我提出了不同的问题:
我有一个向量(1x6):
V = [1 20 5 0 0 9]
我想要一个像这样的矩阵 M (6x6):
[1. 20. 5. 0. 0. 9.]
[0. 1. 20. 5. 0. 0.]
[0. 0. 1. 20. 5. 0.]
[0. 0. 0. 1. 20. 5.]
[0. 0. 0. 0. 1. 20.]
[0. 0. 0. 0. 0. 1.]
在每一行中,它是相同的向量 V(它的一部分),但有一个偏移量以获得三角矩阵。
如何在没有循环的情况下做到这一点?
(这只是一个简单的例子,但真正的向量 V 要大得多)
谢谢你:D
【问题讨论】:
标签: python python-3.x matrix