[Numpy-discussion] Ransom Proposals
Colin J. Williams
cjw at sympatico.ca
Mon Mar 27 08:49:12 CST 2006
Tim Hochberg wrote:
> Bill Baxter wrote:
>
>>
>>
>> On 3/26/06, *Fernando Perez* <Fernando.Perez at colorado.edu
>> <mailto:Fernando.Perez at colorado.edu>> wrote:
>>
>> > Or, you can use the reshape method instead of function. I believe
>> > numpy advocates use of methods instead of functions. What you
>> observe
>> > is just another reason for that. Since functions like reshape
>> remain
>> > in numpy primarily for backwards compatibility, I would be
>> against any
>> > change in semantics.
>>
>> Mmh. I bet many people will continue to use the functional
>> interface for a
>> long time.
>>
>>
>> And maybe they'd be right to want a functional interface, too:
>> http://www.gotw.ca/gotw/084.htm
>>
>>
>> The author argues that in general, you should make as few functions
>> as possible be members of a class, always preferring non-member
>> functions wherever possible. It's about C++, but the principle
>> should apply to Python as well. It does make a certain kind of
>> sense, although the article seems to completely ignore polymorphism,
>> which seems like it would be another good reason to have functions be
>> members, at least in C++.
>
>
>
> Personally, I've always prefered the functional interface, but it
> appears that for historical / backwards compatibility reasons our
> choice is between a functional interface that is broken and a working
> method based interface. For that reason alone, I'm now in favor of
> ditching the functional interface to 'reshape' and 'transpose'.
The transpose function handles a list and returns an array. Of course
the case could be made that things would be clearer if the user wrote
the longer:
a= array([[1, 2]]).transpose()
in place of:
a=transpose([[1, 2]])
Perhaps extension of the T property to the array would simplify things:
a=array([[1, 2]]).T
Colin W.
>
> As to whether 'reshape' and 'transpose' should be functions or methods
> in an ideal world, I think it's worth considering them together. It's
> straightforward to come up with a version of 'reshape' that's fairly
> generic:
>
> def reshape(obj, shape):
> val = obj.view()
> val.shape = shape
> return val
>
> [Unlike the current version of 'reshape', this one always returns a
> view; that is on purpose] This will reshape any object that supports
> both the 'view' method and the 'shape' attribute. Writing something
> equivalent for 'transpose' does not appear possible. I could do
> something like:
>
> def transpose(obj, axes=None):
> if axes == None:
> axes = reversed(range(len(obj.shape)))
> else:
> axes = list(axes)
> shape = numpy.asarray(obj.shape)[axes]
> strides = numpy.asarray(obj.strides)[axes]
> val = obj.view()
> val.shape = shape
> val.strides = strides
> return val
>
> However, while I consider it reasonable to require all array-like
> objects to have 'view' and 'shape', I doubt that it's reasonable to
> have them need 'strides' as well. What would 'strides' mean for a
> sparse array for example? Therefore, 'transpose' should be a method.
> Since I've always considered 'reshape' and 'transpose' a pair and
> would find it disconcerting if one were a method while the other was a
> function (this may be a personal foible however), so I'm coming to the
> view that they should probably have been methods all along.
>
> Regards,
>
> -tim
>
>
>
>
>
>
>
>
>
More information about the Numpy-discussion
mailing list