交叉产品3D空间中的所有点

时间:2017-03-14 13:02:44

标签: python performance numpy vectorization

我有一个向量a,我想与定义的3D空间中的每个点交叉。

import numpy as np

# Grid 
x = np.arange(-4,4,0.1)
y = np.arange(-4,4,0.1)
z = np.arange(-4,4,0.1)

a = [1,0,0]

result = [[] for i in range(3)]

for j in range(len(x)):  # loop on x coords
    for k in range(len(y)):  # loop on y coords
        for l in range(len(z)):  # loop on z coords
            r = [x[j] , y[k], z[l]]
            result[0].append(np.cross(a, r)[0])
            result[1].append(np.cross(a, r)[1])
            result[2].append(np.cross(a, r)[2])

这会生成一个数组,该数组已取a与空间中每个点的叉积。但是,由于嵌套循环,该过程需要太长时间。反正有没有利用矢量(也许是meshgrid?)来加快这个过程?

2 个答案:

答案 0 :(得分:1)

这需要几秒钟才能在我的机器上运行:

from itertools import product
result = [np.cross(a, r) for r in product(x, y, z)]

我不知道这对你来说是否足够快,但涉及到很多计算。它当然更清晰,并且至少有一些冗余减少(例如计算np.cross(a, r)三次)。它也会以稍微不同的格式给出结果,但这是存储结果的自然方式,希望对您的目的很好。

答案 1 :(得分:1)

这是一种矢量化方法 -

np.cross(a, np.array(np.meshgrid(x,y,z)).transpose(2,1,3,0)).reshape(-1,3).T

示例运行 -

In [403]: x = np.random.rand(4)
     ...: y = np.random.rand(5)
     ...: z = np.random.rand(6)
     ...: 

In [404]: result = original_app(x,y,z,a)

In [405]: out = np.cross(a, np.array(np.meshgrid(x,y,z)).\
                    transpose(2,1,3,0)).reshape(-1,3).T

In [406]: np.allclose(result[0], out[0])
Out[406]: True

In [407]: np.allclose(result[1], out[1])
Out[407]: True

In [408]: np.allclose(result[2], out[2])
Out[408]: True

运行时测试 -

# Original setup used in the question
In [393]: # Grid 
     ...: x = np.arange(-4,4,0.1)
     ...: y = np.arange(-4,4,0.1)
     ...: z = np.arange(-4,4,0.1)
     ...: 

# Original approach
In [397]: %timeit original_app(x,y,z,a)
1 loops, best of 3: 21.5 s per loop

# @Denziloe's soln
In [395]: %timeit [np.cross(a, r) for r in product(x, y, z)]
1 loops, best of 3: 7.34 s per loop

# Proposed in this post
In [396]: %timeit np.cross(a, np.array(np.meshgrid(x,y,z)).\
                        transpose(2,1,3,0)).reshape(-1,3).T
100 loops, best of 3: 16 ms per loop

超过 1000x 超过原来的 450x 超过其他帖子的循环方式。