Python 计算涉及不同形状的numpy数组,而不包含for循环?

Python 计算涉及不同形状的numpy数组,而不包含for循环?,python,numpy,vectorization,Python,Numpy,Vectorization,我有以下代码 import numpy as np perp = np.zeros(shape=(100, 3)) perp[:,0] = np.linspace(1,100,100) perp[:,1] = np.linspace(1,200,100) perp[:,2] = np.linspace(-25,25,100) relDist = np.linspace(0,49,50) posCoord = np.zeros(shape=(100, 50, 3)) posMask = np

我有以下代码

import numpy as np

perp = np.zeros(shape=(100, 3))
perp[:,0] = np.linspace(1,100,100)
perp[:,1] = np.linspace(1,200,100)
perp[:,2] = np.linspace(-25,25,100)
relDist = np.linspace(0,49,50)

posCoord = np.zeros(shape=(100, 50, 3))
posMask  = np.where(perp[:,2] >= 0)
negMask  = np.where(perp[:,2] < 0)

posCoord[posMask,:,1] = perp[posMask,1] + relDist[:] / np.sqrt(1 + perp[posMask,2]**2)
posCoord[negMask,:,1] = perp[negMask,1] - relDist[:] / np.sqrt(1 + perp[negMask,2]**2)
posCoord[:,:,0]       = (perp[:,2] * posCoord[:,:,1]) + perp[:,3]
将numpy导入为np
perp=np.0(形状=(100,3))
perp[:,0]=np.linspace(1100100)
perp[:,1]=np.linspace(1200100)
perp[:,2]=np.linspace(-25,25100)
relDist=np.linspace(0,49,50)
posCoord=np.zero(形状=(100,50,3))
posMask=np.where(perp[:,2]>=0)
negMask=np.where(perp[:,2]<0)
posCoord[posMask,:,1]=perp[posMask,1]+relDist[:]/np.sqrt(1+perp[posMask,2]**2)
posCoord[negMask,:,1]=perp[negMask,1]-relDist[:]/np.sqrt(1+perp[negMask,2]**2)
posCoord[:,:,0]=(perp[:,2]*posCoord[:,:,1])+perp[:,3]
如您所见,对于perp中的每个元素,我需要计算一个长度为relDist的值数组,并将其保存到位置posCoord[perp,relCoord,:]。目前,我得到了一个索引错误,因为我不能广播relDist和perp在一起

我可以用一个循环来完成它,100个元素不需要很长时间,但实际上我每个元素大约有10000个元素。有人能帮我把这个矢量化吗?我真的很挣扎。显然,perp和relDist在我的实际代码中是不同的,但这是一个MWE


谢谢

你的意思是
(perp[:,1,None]*posCoord[:,:,1])+perp[:,2,None]
代码除了最后一行外有效,正如Brella所指出的,
np.where
行应该在末尾有
[0]
。而且,最后一行中
perp
的索引是错误的,
perp
有3列,因此有效索引是
0,1,2
,但不是
3
啊,我知道。首先,最后一行的索引是错误的,是的。这是我没有检查的MWE的一位,它是从我的真实代码中复制的,其中3是一个有效的索引。看起来我需要很多,在我的数组索引中没有,否则形状会变得混乱。谢谢。广播阵列时,尾随的
None
newaxis
)必须明确
numpy
会自动添加前导项。这样就不会有歧义,您和
numpy
也不会感到困惑。