2013-06-24 74 views
0

我最近开始使用NumPy(到目前为止它非常有用 - 为什么我不能尽早开始使用它),但仍然有一些我确信我是做错了:NumPy矢量化函数

  • 如何将函数应用于矢量(ndarray)?我希望它是矢量化的,它是一个比乘法更复杂的函数。我试过使用np.where,但这似乎是一个丑陋的解决方案(我不确定它的向量化)。有没有一个类似于map的函数,这样我的函数将被矢量化?

  • 假设我有一个二维数组 - 只是一个二维位置向量的数组,并且假设我想要找到每个向量的范数,并且如果它超过了某个值,请做任何事情。 np.where似乎是一个很好的解决方案,但它不会工作,除非我转置阵列:np.where(sum(a.T**2) > 10, a * 2, 0)(只是一个任意的例子)。这看起来很冗长,而且转置没有多大意义。最后,如果我有一个三维数组 - 一个2维位置向量的二维数组(这样在位置[1,2]将是向量(1,2))。我如何迭代所有的矢量(使用矢量化函数,如np.where)?我一直在使用np.reshape,但如果可能的话,我想保持阵列的形状相同。

我要将这些问题一起,因为他们似乎相似,但如果我需要把它们分割成单独的线程,请让我知道,我会这么做。

+0

虽然有*是*的方式做你所描述的事情,你可能会检查出['pandas'](http://pandas.pydata.org/),它可以处理许多这些操作。 –

+0

你的第一个问题是什么意思?显然,你可以将多个算术和其他算子连接在一起来构建一个更大的函数。否则,如果你想要矢量化你的函数,你需要放入C或者Fortran(或者Cython),因为numpy没有办法绕过每个元素的函数调用。 –

+0

但是,我不能说,例如,从每个元素创建一个新的numpy数组总和呢? (只是一个例子,我不会只是总结它)。 – James

回答

0

像上面的评论,我不太清楚你在问什么。但对于第一个问题,请参考此示例:

假设您有一个2d向量的numpy数组,并且您想计算每个向量的范数。你能不能做这样的事情:

import numpy as np 

x = np.arange(20).reshape(10,2) 
norm_func = lambda z: sum(z**2) 
norm_func(x.T) 

这将使结果

array([ 1, 5, 9, 13, 17, 21, 25, 29, 33, 37]) 

为阵

array([[ 0, 1], 
     [ 2, 3], 
     [ 4, 5], 
     [ 6, 7], 
     [ 8, 9], 
     [10, 11], 
     [12, 13], 
     [14, 15], 
     [16, 17], 
     [18, 19]])