[Numpy-discussion] Can this be done more efficiently using numpy?
Didrik Pinte
lists at dipole-consulting.com
Thu Apr 1 04:21:01 EDT 2010
On Wed, 2010-03-31 at 23:13 -0700, Vishal Rana wrote:
> Hi,
>
>
> A calculation which goes like this...
>
>
> n = 5
> a = np.arange(1000)
> b = np.arange(n - 1, 1000)
>
>
> l = []
> for i in range(b.size):
> # Absolute difference of n a elements and nth b element
> x = np.abs(a[i:i + n] - b[i])
>
> # Average of x
> y = x.sum() / n
>
> l.append(y)
>
>
> It takes a while if I have like 200K records!
> Is there a more efficient way to do this using numpy?
Like this ?
import numpy
from numpy.lib.stride_tricks import as_strided
n = 5
a = numpy.arange(1000)
b = numpy.arange(n - 1, 1000)
def sum_1(n, a, b):
# original method
l = []
for i in range(b.size):
# Absolute difference of n a elements and nth b element
x = numpy.abs(a[i:i + n] - b[i])
# Average of x
y = x.sum() / n
l.append(y)
return l
def sum_numpy(n, a, b):
ast = as_strided(a, shape=(1000-n+1, n), strides=(8,8))
diff = numpy.abs(ast - b[:,None])
y = diff.sum(axis=1) /n
return y
test1 = sum_1(n,a,b)
test2 = sum_numpy(n,a,b)
assert(numpy.alltrue(test2 == test1))
-- Didrik
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20100401/0306d113/attachment.sig>
More information about the NumPy-Discussion
mailing list