python - 从 numpy 矩阵中最优提取列

标签 python optimization numpy

假设我有一个像这样的 numpy 矩阵:

[[ x1, x2, x3, ... ],
 [ y1, y2, y3, ... ],
 [ z1, z2, z3, ... ],
 [ 1,  1,  1,  ... ]]

我想从中提取列表列表,如下所示:

[[x1, y1, z1], [x2, y2, z2], [x3, y3, z3], ... ]

执行此操作的最佳方法是什么?

目前我有:

tpoints = [pt[:3].tolist() for pt in numpy.asarray(tptmat.T)]

tolist() 的调用占用了不成比例的时间,大约是我程序中最耗时的函数所花费时间的三分之一。

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
 14422540   69.777    0.000   69.777    0.000 {method 'tolist' of 'numpy.ndarray' objects}
       20   64.258    3.213  178.057    8.903 trans.py:152(_apply)
      ...

最佳答案

为什么不删除转置前的最后一行?

m[:3].T.tolist()
#      ^^^^^^^^^ optional

微基准测试表明,对于 100×4 矩阵,此方法比您的方法快 61%,如果您不将其转换为列表列表,则速度快 45 倍。

$ python2.5 -m timeit -s 'import numpy; m = numpy.matrix([[5]*100,[6]*100,[7]*100,[1]*100])' 'm[:3].T'
100000 loops, best of 3: 6.26 usec per loop
$ python2.5 -m timeit -s 'import numpy; m = numpy.matrix([[5]*100,[6]*100,[7]*100,[1]*100])' 'm[:3].T.tolist()'
10000 loops, best of 3: 180 usec per loop
$ python2.5 -m timeit -s 'import numpy; m = numpy.matrix([[5]*100,[6]*100,[7]*100,[1]*100])' 'numpy.asarray(m[:3].T)'
100000 loops, best of 3: 10.9 usec per loop
$ python2.5 -m timeit -s 'import numpy; m = numpy.matrix([[5]*100,[6]*100,[7]*100,[1]*100])' '[p[:3].tolist()for p in numpy.asarray(m.T)]'
1000 loops, best of 3: 289 usec per loop

关于python - 从 numpy 矩阵中最优提取列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3315894/

相关文章:

python - 如何在pytorch中实现可微分的汉明损失?

python - Python 中的响应面建模和优化 : Analogous to rsm in R?

python - 与 NumPy 等效的 Pandas nunique

Python:如何从键值字典列表构造元组值字典?

python - 尝试使用 Beautiful Soup - Python 提取 html 页面时出现“charmap”编解码器错误

c++ - 使用 std::accumulate 和 std::string 有效

c++ - 如何减少内存使用 - 可能的内存泄漏

python - 如何在 Python 中生成唯一的随机数作为数组?

python - 如何 reshape numpy图像?

python - 列出数据湖中文件夹中的所有文件