python - 3D 数组的高效迭代?

标签 python numpy

我正在使用 Python 和 Numpy 进行一些数据分析。

我有一个大型 3D 矩阵 (NxNxN),其中每个单元格又是一个矩阵,这次是 3x3 矩阵。调用矩阵data,看起来像这样:

data[N,N,N,3,3]  

我需要找到所有 3x3 矩阵的特征值,为此我使用了 Numpy 的 eigvals 例程,但这需要很长时间才能完成。现在我几乎是这样做的:

for i in range(N):
    for j in range(N):
        for k in range(N):
            a = np.linalg.eigvals(data[i,j,k,:,:])

对于 N = 256,这大约需要一个小时。关于如何提高效率的任何想法?

非常感谢您的任何建议!

最佳答案

itertools.product从美学上讲,它比嵌套循环更好。但我认为它不会使您的代码更快。我的测试表明迭代不是你的瓶颈。

>>> bigdata = numpy.arange(256 * 256 * 256 * 3 * 3).reshape(256, 256, 256, 3, 3)
>>> %timeit numpy.linalg.eigvals(bigdata[100, 100, 100, :, :])
10000 loops, best of 3: 52.6 us per loop

太低估了:

>>> .000052 * 256 * 256 * 256 / 60
14.540253866666665

在我的电脑上至少需要 14 分钟,这是很新的。让我们看看循环需要多长时间...

>>> def just_loops(N):
...     for i in xrange(N):
...         for j in xrange(N):
...             for k in xrange(N):
...                 pass
... 
>>> %timeit just_loops(256)
1 loops, best of 3: 350 ms per loop

如帝斯曼所说,数量级更小。甚至单独对数组进行切片的工作量也更大:

>>> def slice_loops(N, data):
...     for i in xrange(N):
...         for j in xrange(N):
...             for k in xrange(N):
...                 data[i, j, k, :, :]
... 
>>> %timeit slice_loops(256, bigdata)
1 loops, best of 3: 33.5 s per loop

关于python - 3D 数组的高效迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6973849/

相关文章:

python - 制作列表到字符串 Python

python - __name__ ==“__main__”怎么办?

python - Numpy 函数输出随着每次运行而增加

python - Numpy:查找两个不同数组中值的索引条件(来自 R)

python - 为什么在连接两个字符串时 Python 比 C 快?

python - QStandardItem 缺少 __hash__ 方法

python - 如何捕获 ctrl-c 以杀死 Flask python 脚本

python Pandas : Aggregate rows conditional value picking

python - 使用 numpy 将棕褐色效果应用于 3D 数组

python - 带有负索引的numpy数组索引