[Numpy-discussion] Should non ufunc numpy functions behave like ufunc regarding casting to output argument ?
David Cournapeau
david at ar.media.kyoto-u.ac.jp
Mon Jan 15 21:44:48 CST 2007
David Cournapeau wrote:
> Charles R Harris wrote:
>>
>> On 1/15/07, *A. M. Archibald* <peridot.faceted at gmail.com
>> <mailto:peridot.faceted at gmail.com>> wrote:
>>
>> On 15/01/07, David Cournapeau <david at ar.media.kyoto-u.ac.jp
>> <mailto:david at ar.media.kyoto-u.ac.jp>> wrote:
>> > Hi,
>> >
>> > I am trying to add support for out argument to one C
>> function using
>> > numpy API (still the clip function). I was wondering about the
>> expected
>> > behaviour when out does not have the "expected" type.
>> > For example, using again the clip function (but the question
>> is not
>> > specific to this function)
>> >
>> > In [1]: import numpy
>> >
>> > In [2]: a = numpy.linspace(0, 10, 101)
>> >
>> > In [3]: b = numpy.zeros(a.shape, dtype = numpy.int32)
>> >
>> > In [4]: print a.dtype
>> > float64
>> >
>> > In [5]: a.clip(0.1, 0.5, b)
>> >
>> > Should this be equivalent to b = a.clip(0.1, 0.5); b =
>> > b.astype(numpy.int32) (ie, the casting is done at the end,
>> similar to an
>> > ufunc) ?
>>
>> Since the point of output arguments is to avoid allocating new
>> storage,
>>
>>
>>
>> If we take that seriously, then an error should be raised on a shape,
>> or type mismatch.
> For the shape, there is no problem, I guess. A different shape is an
> error (except if I want to support broadcasting...). The problem is
> really for out having same shape than in, but having different type than
> input.
>
> At first, I wanted to throw an error (for example, clipping an array
> which gives a float, and out is integer), but that would be incompatible
> with current clip behaviour.
>
> Concerning the point of avoiding allocating new storage, I am a bit
> suspicious: if the types do not match, and the casting is done at the
> end, then it means all internal computation will be done is whatever
> type is chosen by the function (I am using PyArray_CommonType for that),
> and the cast done at the end, meaning new storage.
>
> Actually, I find more logical to throw an error of the point is to avoid
> new storage, as giving a mismatched type out buffer would make the
> function create an internal buffer.
Sorry, this last sentence is incomplete and does not really make sense:
I meant
Actually, I find more logical to throw an error of the point is to avoid
new storage, as giving a mismatched type out buffer would make the
function create an new array when using the numpy C Api function PyArray_ConvertToCommonType.
David
More information about the Numpy-discussion
mailing list