【发布时间】:2020-07-08 04:50:47
【问题描述】:
我想基于 n + m 长度数组的元素创建一个 n by m 矩阵。
这里有一个简单的 double for 循环就足够了,但我希望有一个权宜之计的解决方案。矩阵会比较小。
n = 4
m = 6
s = n + m
array = np.arange(s) # note: arange is only for example. real array varies.
matrix = np.zeros((n,m))
for i in range(n):
for j in range (m):
matrix[i,j] = array[i+j]
我发现理解比双循环更快
matrix3 = [[array[i+j] for i in range(m)] for j in range(n)]
有没有更快的方法?
另一个好处是合并模运算符。我实际上只需要i+j % 2 == 0 所在的索引。在双 for 循环中,取模方法似乎要快一点,但这对于通过 numpy 生成此矩阵可能不方便或权宜之计。
最好不要这样做,因为矩阵乘法会发生在之后,必要的元素无论如何都会乘以零。我提到模数只是在这种情况下,这会导致更快的解决方案。
对于这个 MWE
for i in range(n):
for j in range (m):
if (i + j) % 2 == 0:
matrix[i,j] = array[i+j]
注意:
我要求一个 numpy 解决方案,假设 numpy 会最快,但任何纯 python(包括 numpy/scipy)解决方案都可以,只要它比纯 python double for 循环更快
动机:
我正在尝试从双 for 循环中删除对数组的所有依赖项,以便我可以使用广播而不是双 for 循环。这是剩下的最后一个数组
【问题讨论】:
-
arr[:, None]+ arr -
这似乎不起作用。我不明白它怎么知道要做成什么形状?最终结果不会是 n x m 矩阵吗?这不会构成 (n+m) x (n+m) 矩阵吗?
标签: python python-3.x numpy matrix