[Numpy-discussion] order flag again
tim.hochberg at cox.net
Mon Mar 27 11:08:03 CST 2006
I notice that some methods of the array object, notably reshape, take
the order flag. I think this is a mistake. At this point, x.reshape()
should always be returning a view. That means it's a cheap operation.
Similarly, setting the order flag is also a cheap operation[*]. For that
reason there's not a pressing efficiency reason to combine to the two
operations and I feel that they should be broken apart. Thus we'd gain
an operation 'setorder' or similar and lose the order flag everywhere
but array and the various asXXXarray[**] functions since they need it to
efficiently construct a correctly ordered array. Thus:
b = a.reshape(newshape, order=neworder)
b = a.reshape(newshape).setorder(neworder)
That doesn't look substantially better in that form, but compare:
b = a.reshape(weeble, order=wobble)
b = a.reshape(weeble).setorder(wobble)
And the superiority of the second form begins to becomes apparent. The
requirement that order be keyword parameter helps, but not enough IMO.
The second form is orthogonal and self documenting and just all around
more swell ;)
[*] I know this even though I haven't thought through what reshape plus
the order flag is doing because reshape isn't allowed to return a copy.
Thus setting the order flag in this context must amount to just
rejiggering shape and strides.
[**] And I suppose, maybe, ravel. However, ravel is yet another evil
function, or rather method in this case, that sometimes returns a view
and sometimes a copy. Ravels is really unnecessary, and I don't have the
energy to wage a campaign against its evil ways (much to everyones
relief I imagine), so I plan to just ignore it and recomend that no one
use it . Ever.
More information about the Numpy-discussion