Numpy 如何矢量化喷溅矢量的处理

Numpy 如何矢量化喷溅矢量的处理,numpy,vectorization,Numpy,Vectorization,我有一个数字向量(这里是随机的)。我想计算向量中每个数字左右两侧的连续关系(这里的意思是澄清示例) 下面是一个程序示例。我对矢量化的形式感兴趣 从numpy.random导入 将numpy作为np导入 数字=兰特(40) k=np.零(数字.形状) 对于范围内的i(*编号.形状): k[i]=np.mean(数字[:i])/np.mean(数字[i:]) 此示例将在第一次迭代中返回nan,但现在不是问题。这里是一种矢量化方法- n = len(numbers) fwd = number

我有一个数字向量(这里是随机的)。我想计算向量中每个数字左右两侧的连续关系(这里的意思是澄清示例)

下面是一个程序示例。我对矢量化的形式感兴趣

从numpy.random导入
将numpy作为np导入
数字=兰特(40)
k=np.零(数字.形状)
对于范围内的i(*编号.形状):
k[i]=np.mean(数字[:i])/np.mean(数字[i:])

此示例将在第一次迭代中返回nan,但现在不是问题。

这里是一种矢量化方法-

n = len(numbers)    
fwd = numbers.cumsum()/np.arange(1,n+1)
bwd = (numbers[::-1].cumsum()[::-1])/np.arange(n,0,-1)
k_out = np.r_[np.nan,fwd[:-1]]/bwd
用一个
cumsum
再优化一点,它将是-

n = len(numbers)
r = np.arange(1,n+1)

c = numbers.cumsum()
fwd = c/r
b = c[-1]-c
bwd = np.r_[1,b[:-1]]/r[::-1]
k_out = np.r_[np.nan,fwd[:-1]]/bwd

我花了一些时间,有一个简单而通用的解决方案:numpy.vectorize with
excluded
参数,其中指定要拆分的向量必须从矢量化中排除。该示例仍使用np.mean,但可替换为任何函数:

def分割平均值(向量,i):
返回np.mean(向量[:i])/np.mean(向量[i:])
v_分割平均值=np.矢量化(分割平均值)
v_分割_平均值。排除。添加(0)
数字=np.rand.rand(30)
索引=np.arange(*数字.shape)
v_分割平均值(数字、指数)

解决方案取决于要计算的操作的精确性质。如果这是方法,如您的示例中所示,那么Divakar已经发布了一个解决方案。但是,如果您的操作不同,并且这只是一个示例,那么解决方案就会不同(如果可能的话)。对于那个“问题类型”并没有通用的好的解决方案,但它只解决了这个具体的例子。事实上,我问的是分裂向量左右两侧的连续关系。我给出了
mean
以创建可复制且简单的示例。所以我假设没有通用的解决方案,或者根本没有@jdehesa的解决方案suggest@jarekj71没有神奇的解决方案可以解决任何一般问题。这都是个案分析的基础。
np.vectorize
如何改进现有的for循环?正如文档中指出的那样,
np.vectorize
基本上是在引擎盖下循环的,我会惊讶地看到任何明显的改进。