[Numpy-discussion] non-linear array manipulation
Daniel Lenski
dlenski at gmail.com
Wed Aug 13 21:55:19 EDT 2008
On Tue, 12 Aug 2008 10:37:51 -0400, Gong, Shawn (Contractor) wrote:
> The following array manipulation takes long time because I can't find
> ways to do in row/column, and have to do cell by cell. Would you check
> to see if there is a nicer/faster way for this non-linear operation?
>
> for i in range(rows):
> for j in range(columns):
> a[i][j] = math.sqrt( max(0.0, a[i][j]*a[i][j] - b[j]*c[j]) )
In order to figure out how to do things like this efficiently, I like to
write out the mathematical formula in subscript-summation notation first:
a_ij = sqrt( max(0.0, a_ij - b_j*c_j) )
Now this could be done on an element-wise basis if you redefine b and c
as matrices:
B_ij = b_j and C_ij = c_j
=> a_ij = sqrt( max(0.0, a_ij - B_ij*C_ij) )
Fortunately, with NumPy this is easy and doesn't require any data copying
or extra memory use:
B = b[newaxis, :]
C = c[newaxis, :]
a = sqrt(maximum(0.0, a-B*C))
That's your solution. It's a standard application of the broadcasting
technique, which is crucial for time- and memory- efficient array-based
algorithms. It is explained in detail in the NumPy tutorial.
Hope that helps,
Dan
More information about the NumPy-Discussion
mailing list