@@ -36,12 +36,12 @@ def validate_unit_quantity(value):
3636
3737def validate_dimensionality (value ):
3838 if isinstance (value , str ):
39- return unit_registry [value ].dimensionality . copy ()
39+ return unit_registry [value ].dimensionality
4040 elif isinstance (value , Quantity ):
4141 validate_unit_quantity (value )
42- return value .dimensionality . copy ()
43- elif isinstance (value , ( Dimensionality , dict ) ):
44- return value . copy ()
42+ return value .dimensionality
43+ elif isinstance (value , Dimensionality ):
44+ return value
4545 else :
4646 raise TypeError (
4747 'units must be a quantity, string, or dimensionality, got %s' \
@@ -66,21 +66,15 @@ def __new__(cls, data, units='', dtype=None, copy=True):
6666 if isinstance (data , cls ):
6767 if units :
6868 data = data .rescale (units )
69- if copy or (dtype and data .dtype != dtype ):
70- return data .astype (dtype )
71- return data
72-
73- ret = numpy .asarray (data , dtype ).view (cls )
74- if copy :
75- ret = ret .copy ()
76-
77- ret ._dimensionality = validate_dimensionality (units )
69+ return numpy .array (data , dtype = dtype , copy = copy , subok = True )
7870
71+ ret = numpy .array (data , dtype = dtype , copy = copy ).view (cls )
72+ ret ._dimensionality .update (validate_dimensionality (units ))
7973 return ret
8074
8175 @property
8276 def dimensionality (self ):
83- return self ._dimensionality
77+ return self ._dimensionality . copy ()
8478
8579 @property
8680 def magnitude (self ):
@@ -142,17 +136,12 @@ def astype(self, dtype=None):
142136 ret = super (Quantity , self ).astype (dtype )
143137 # scalar quantities get converted to plain numbers, so we fix this:
144138 if not isinstance (ret , type (self )):
145- ret = type (self )(ret , self .units )
139+ ret = type (self )(ret , self ._dimensionality )
146140
147141 return ret
148142
149- def __array__ (self , dtype = None ):
150- return type (self )(self , dtype , copy = True )
151-
152143 def __array_finalize__ (self , obj ):
153144 self ._dimensionality = getattr (obj , 'dimensionality' , Dimensionality ())
154- if self .base is None :
155- self ._dimensionality = self ._dimensionality .copy ()
156145
157146# def __array_wrap__(self, obj, context=None):
158147# """
@@ -368,7 +357,7 @@ def __str__(self):
368357
369358 def __getitem__ (self , key ):
370359 if isinstance (key , int ):
371- return Quantity (self .magnitude [key ], self .units )
360+ return Quantity (self .magnitude [key ], self ._dimensionality )
372361 else :
373362 return super (Quantity , self ).__getitem__ (key )
374363
@@ -377,7 +366,7 @@ def __setitem__(self, key, value):
377366 value = Quantity (value )
378367
379368 # TODO: do we want this kind of magic?
380- self .magnitude [key ] = value .rescale (self .units ).magnitude
369+ self .magnitude [key ] = value .rescale (self ._dimensionality ).magnitude
381370
382371 def __lt__ (self , other ):
383372 ss , os = prepare_compatible_units (self , other )
@@ -528,8 +517,8 @@ def clip(self, min=None, max=None, out=None):
528517 )
529518
530519 clipped = self .magnitude .clip (
531- min .rescale (self .units ).magnitude ,
532- max .rescale (self .units ).magnitude ,
520+ min .rescale (self ._dimensionality ).magnitude ,
521+ max .rescale (self ._dimensionality ).magnitude ,
533522 out
534523 )
535524 return Quantity (clipped , self .dimensionality , copy = False )
0 commit comments