我有一个向量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?)来加快这个过程?
答案 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
超过其他帖子的循环方式。