我已阅读此post,并怀疑我需要更好地理解索引。我想这样做np.ndenumerate
,但(在这种特殊情况下)仅在第一三个维度,返回了一系列载体:像部分/选择np.ndenumerate?
x = np.linspace(0., 1., 4)
y = np.linspace(0., 1., 5)
z = np.linspace(0., 1., 2)
X, Y, Z = np.meshgrid(x, y, z) # define a grid
F = np.zeros(X.shape + (3,)) # a 3D vector field
F = np.random.rand(5*4*2*3).reshape(5,4,2,3) # added this later just to give non-zero for testing
thetas = np.linspace(0, 2.*np.pi, 21)[:-1] # drop the duplicate
v = np.array([(np.cos(theta), np.sin(theta), 0.0) for theta in thetas])
for tup, vec in magical_enumerate(F, axis=(0,1,2)): # it's magic! (need correct expression)
F(tup) = np.cross(v, vec).sum(axis=0) # sum over 20 vectors in v
有没有办法做到这一点没有大量的循环或列表的解释?网格将很大,所以numpythony和速度值得赞赏。非连续维度(例如,轴=(0,2))呢?谢谢!
你可以发布可运行代码,因为'magical_enumerate'是未定义的吗? – Divakar 2015-04-06 06:18:02
嗨Divarak,这是我在SO中看到的那种速记,因为“我不知道该把什么放在这里,但这是我正在寻找的东西。”该代码仅仅是一个帮助澄清文本的例子。 – uhoh 2015-04-06 07:43:19
我可能已经弄错了,但是你不能只是重塑'F',然后像'np.sum(np.cross(F.reshape(-1,F.shape [-1 ]),vec),1)'然后用这些值设置为'F'? – Divakar 2015-04-06 09:18:51