【问题标题】:Python: speed of conversion of type of 3d matrix elementPython:3d矩阵元素类型的转换速度
【发布时间】:2023-04-09 10:18:01
【问题描述】:

我相信这是一个简单的问题,但我是 Python 新手,因此我们将不胜感激任何建议。 我有字符串矩阵,我需要将每个元素转换为浮点类型,然后将其增加一些数字。我是这样做的:

for i in range(0,len(matrix)):
    for j in range(0,len(matrix[i])):
        for k in range(0,len(matrix[j])):
            matrix[i][j][k] = float(matrix[i][j][k]) + 5.555

有没有其他方法可以提高速度?当我有 matrix[50][50][50] 或更大时,性能真的很低。 有没有一种方法可以一次增加所有元素?

【问题讨论】:

  • 第三个 for 在一般情况下应该是 for k in range(0,len(matrix[i][j])): 尽管在你的二次矩阵的情况下它并不重要。
  • 使用numpy获得的最佳加速。

标签: python performance matrix type-conversion


【解决方案1】:

您可以对代码进行一些低级优化,例如将 range() 调用移到循环之外,这样您就不会每次都创建一个新列表(或者如果您使用 3.x,则创建一个生成器)绕圈。

不过最大的优化是切换到使用numpy,它将以高性能 C 代码跨整个数组执行操作。

【讨论】:

    【解决方案2】:

    每当您在 Python 中进行数组工作时,如果可能,最好使用 numpy 库。

    import numpy
    
    matrix = numpy.asarray(matrix,dtype=numpy.float64) + 5.555
    

    【讨论】:

      【解决方案3】:

      如果matrix 兼容,那么您可以(并且可能应该)将其放入numpy 数组中。它是一个非常方便的数值计算库,并带有许多功能:根据您想要做什么,您可能还想查看scipy

      import numpy as np
      
      a = np.array(matrix)
      a += 5.5555
      

      以一些随机数据为例:

      from numpy.random import random_sample
      
      >>> a = random_sample( (3, 3, 3) )
      >>> a
      array([[[ 0.98899266,  0.10761687,  0.7784259 ],
              [ 0.79253918,  0.450742  ,  0.46417501],
              [ 0.71733034,  0.26575819,  0.19360072]],
      
             [[ 0.41609296,  0.96195897,  0.32777537],
              [ 0.59527144,  0.96655918,  0.50073892],
              [ 0.70797323,  0.406036  ,  0.47092251]],
      
             [[ 0.8572665 ,  0.00076713,  0.25379833],
              [ 0.03426925,  0.59837259,  0.85390736],
              [ 0.78306972,  0.00238982,  0.28702393]]])
      >>> a += 5.55555
      >>> a
      array([[[ 6.54454266,  5.66316687,  6.3339759 ],
              [ 6.34808918,  6.006292  ,  6.01972501],
              [ 6.27288034,  5.82130819,  5.74915072]],
      
             [[ 5.97164296,  6.51750897,  5.88332537],
              [ 6.15082144,  6.52210918,  6.05628892],
              [ 6.26352323,  5.961586  ,  6.02647251]],
      
             [[ 6.4128165 ,  5.55631713,  5.80934833],
              [ 5.58981925,  6.15392259,  6.40945736],
              [ 6.33861972,  5.55793982,  5.84257393]]])
      

      【讨论】:

        猜你喜欢
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多