我编写了一个方法,它接受一个整数“n”并创建一个方阵,其中每个元素的值由它们各自的 i、j 索引决定。
当我构建一个 30x30 的小矩阵时,它工作得很好,但是当我尝试做更大的矩阵(如 1000x1000)时,它需要很长时间。有什么方法可以通过多处理来加快速度吗?
def createMatrix(n):
matrix = []
for j in range(1,n+1):
row = []
for i in range(1,n+1):
value = 1/(i+j-1)
row.append(value)
matrix.append(row)
return np.array(matrix)
最佳答案
在 Python 中并行化两个计算绑定(bind)的 for
循环并非易事,因为有 GIL。好消息是您的案例完全可以矢量化:
def createMatrix(n):
return 1 / (np.arange(n)[None, :] + np.arange(n)[:, None] + 1)
解释:
- 基本上,您的矩阵公式是
X[row][column] = 1/(row+column-1)
,其中行和列从 1 开始 np.arange(n)
创建可用于行或列的范围[None, :]
和[:, None]
将其转换为二维数组,1 x n
或n x 1
numpy
然后广播维度,复制行和列索引以匹配维度 - 因此,在添加时将两者隐式平铺到n x n
- 因为两个范围都是从 0 开始的,所以使用
+1
而不是-1
根据经验,在 numpy 数组上使用 for 循环几乎不是一个好主意。矢量化方法(即矩阵形式的计算)要快几个数量级。
关于python - 并行运行两个嵌套的 for 循环以创建矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72618859/