我写了一个方法,它接受一个整数"n",并创建一个平方矩阵,其中每个元素的值由它们各自的I,j索引决定.

当我构建一个小矩阵30x30时,它工作得很好,但当我try 做一些更大的事情,比如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)

推荐答案

由于GIL的存在,在Python中并行两个计算范围为for的循环并非易事.好消息是,您的 case 完全可以矢量化:

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]将其转换为2d数组,1 x nn x 1
  • numpy然后广播维度,复制行和列索引以匹配维度-因此,添加时隐式平铺到n x n
  • 因为这两个范围都是基于0的,所以使用+1而不是-1

根据经验,在numpy数组上使用循环几乎从来都不是一个好主意.矢量化方法(即矩阵形式计算)的速度要快几个数量级.

Python相关问答推荐

如何列出Python脚本中使用的所有包?

为什么Pydantic在我申报邮箱时说邮箱丢失

如何分割我的收件箱,以便连续的数字各自位于自己的收件箱中?

使用Python从HTTP打印值

按日期和组增量计算总价值

如何在telegram 机器人中发送音频?

使用Python C API重新启动Python解释器

pyramid 内部数组中的连续序列-两极

为什么基于条件的过滤会导致pandas中的空数据框架?

将numpy矩阵映射到字符串矩阵

配置Sweetviz以分析对象类型列,而无需转换

Pystata:从Python并行运行stata实例

什么相当于pytorch中的numpy累积ufunc

发生异常:TclMessage命令名称无效.!listbox"

pyscript中的压痕问题

如何从pandas的rame类继承并使用filepath实例化

如何保持服务器发送的事件连接活动?

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

未调用自定义JSON编码器

在代码执行后关闭ChromeDriver窗口