Hey, this is indirectly related (I think it might fix many of these memmap oddities though?)... Why does the memmap object not implement: def __array_wrap__(self, obj): if self is obj: return obj return np.array(obj, copy=False, subok=False) By doing so if we have a ufunc with only memmap objects, the result will not be a memmap object, but if the ufunc has an output parameter, then "self is obj" which means that it is not casted. The problem is that subclass automatically inherit an __array_wrap__ method that sets the result to the subclasses type (which is not generally wanted for memmaps). May make a PR for this... Regards, Sebastian On Fri, 2012-09-21 at 14:59 +0200, Wim Bakker wrote:
I'm deeply puzzled by the recently changed behavior of zero-rank memmaps. I think this change happened from version 1.6.0 to 1.6.1, which I'm currently using.
import numpy as np
Create a zero-rank memmap.
x = np.memmap(filename='/tmp/m', dtype=float, mode='w+', shape=())
Give it a value:
x[...] = 22 x memmap(22.0)
So far so good. But now:
b = (x + x) / 1.5 b memmap(29.333333333333332)
WT.? Why is the result of this calculation a memmap?
It even thinks that it's still linked to the file, but it's not:
b.filename '/tmp/m'
If I try this with arrays then I don't get this weird behavior:
a = np.array(2, dtype=float)
(a + a) / 2.5 1.6000000000000001
which gives me a Python float, not a zero-rank array.
Why does the memmap behave like that? Why do I get a memmap even though it's not connected to any file?
Regards,
Wim _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion