@@ -188,23 +188,21 @@ def __getitem__(self, slicer):
188
188
return apply_read_scaling (raw_data , self ._slope , self ._inter )
189
189
190
190
def reshape (self , shape ):
191
- ''' Return an ArrayProxy with a new shape, without modifying data
192
-
193
- ``array_proxy.reshape(shape)`` is equivalent to
194
- ``np.reshape(array_proxy, shape)``
195
- '''
191
+ ''' Return an ArrayProxy with a new shape, without modifying data '''
196
192
size = np .prod (self ._shape )
197
193
198
194
# Calculate new shape if not fully specified
199
- shape_arr = np .asarray (shape )
200
- unknowns = shape_arr == - 1
201
- if len (unknowns ) > 1 :
195
+ from operator import mul
196
+ from functools import reduce
197
+ n_unknowns = len ([e for e in shape if e == - 1 ])
198
+ if n_unknowns > 1 :
202
199
raise ValueError ("can only specify one unknown dimension" )
203
- elif len (unknowns ) == 1 :
204
- uk_val = size // np .prod (shape_arr [~ unknowns ])
205
- shape_arr [unknowns ] = uk_val
200
+ elif n_unknowns == 1 :
201
+ known_size = reduce (mul , shape , - 1 )
202
+ unknown_size = size // known_size
203
+ shape = tuple (unknown_size if e == - 1 else e for e in shape )
206
204
207
- if shape_arr .prod () != size :
205
+ if np .prod (shape ) != size :
208
206
raise ValueError ("cannot reshape array of size {:d} into shape "
209
207
"{!s}" .format (size , shape ))
210
208
return self .__class__ (file_like = self .file_like ,
0 commit comments