@@ -24,7 +24,7 @@ def setup():
24
24
25
25
26
26
def generate_data (nb_arrays , common_shape , rng ):
27
- data = [rng .rand (* (rng .randint (3 , 20 ),) + common_shape )
27
+ data = [rng .rand (* (rng .randint (3 , 20 ),) + common_shape ) * 100
28
28
for _ in range (nb_arrays )]
29
29
return data
30
30
@@ -228,9 +228,6 @@ def test_arraysequence_getitem(self):
228
228
for i , e in enumerate (SEQ_DATA ['seq' ]):
229
229
assert_array_equal (SEQ_DATA ['seq' ][i ], e )
230
230
231
- if sys .version_info < (3 ,):
232
- assert_array_equal (SEQ_DATA ['seq' ][long (i )], e )
233
-
234
231
# Get all items using indexing (creates a view).
235
232
indices = list (range (len (SEQ_DATA ['seq' ])))
236
233
seq_view = SEQ_DATA ['seq' ][indices ]
@@ -278,49 +275,42 @@ def test_arraysequence_getitem(self):
278
275
check_arr_seq (seq_view , [d [:, 2 ] for d in SEQ_DATA ['data' ][::- 2 ]])
279
276
280
277
def test_arraysequence_operators (self ):
281
- for op in ["__add__" , "__sub__" , "__mul__" , "__floordiv__" , "__truediv__" ,
282
- "__eq__" , "__ne__" , "__lt__" , "__le__" , "__gt__" , "__ge__" ]:
283
- # Test math operators with a scalar.
284
- for scalar in [42 , 0.5 , True ]:
285
- seq = getattr (SEQ_DATA ['seq' ], op )(scalar )
286
- assert_true (seq is not SEQ_DATA ['seq' ])
287
- check_arr_seq (seq , [getattr (d , op )(scalar ) for d in SEQ_DATA ['data' ]])
278
+ # Disable division per zero warnings.
279
+ flags = np .seterr (divide = 'ignore' , invalid = 'ignore' )
280
+ SCALARS = [42 , 0.5 , True , - 3 , 0 ]
281
+ CMP_OPS = ["__eq__" , "__ne__" , "__lt__" , "__le__" , "__gt__" , "__ge__" ]
288
282
289
- # Test math operators with another ArraySequence.
290
- seq = getattr ( SEQ_DATA ['seq' ], op )( SEQ_DATA [ 'seq' ] )
291
- assert_true ( seq is not SEQ_DATA [ 'seq' ] )
292
- check_arr_seq ( seq , [ getattr ( d , op )( d ) for d in SEQ_DATA ['data' ]])
283
+ seq = SEQ_DATA [ 'seq' ]. copy ()
284
+ seq_int = SEQ_DATA ['seq' ]. copy ( )
285
+ seq_int . _data = seq_int . _data . astype ( int )
286
+ seq_bool = SEQ_DATA ['seq' ]. copy () > 30
293
287
294
- # Test math operators with ArraySequence views.
295
- orig = SEQ_DATA ['seq' ][::2 ]
296
- seq = getattr (orig , op )(orig )
288
+ ARRSEQS = [seq , seq_int , seq_bool ]
289
+ VIEWS = [seq [::2 ], seq_int [::2 ], seq_bool [::2 ]]
290
+
291
+ def _test_unary (op , arrseq ):
292
+ orig = arrseq .copy ()
293
+ seq = getattr (orig , op )()
297
294
assert_true (seq is not orig )
298
- check_arr_seq (seq , [getattr (d , op )(d ) for d in SEQ_DATA ['data' ][::2 ]])
299
-
300
- # Test in-place operators.
301
- for op in ["__iadd__" , "__isub__" , "__imul__" , "__ifloordiv__" , "__itruediv__" ]:
302
- # Test in-place math operators with a scalar.
303
- for scalar in [42 , 0.5 , True ]:
304
- seq = seq_orig = SEQ_DATA ['seq' ].copy ()
305
- seq = getattr (seq , op )(scalar )
306
- assert_true (seq is seq_orig )
307
- check_arr_seq (seq , [getattr (d .copy (), op )(scalar ) for d in SEQ_DATA ['data' ]])
308
-
309
- # Test in-place math operators with another ArraySequence.
310
- seq = seq_orig = SEQ_DATA ['seq' ].copy ()
311
- seq = getattr (seq , op )(SEQ_DATA ['seq' ])
312
- assert_true (seq is seq_orig )
313
- check_arr_seq (seq , [getattr (d .copy (), op )(d ) for d in SEQ_DATA ['data' ]])
314
-
315
- # Test in-place math operators with ArraySequence views.
316
- seq = seq_orig = SEQ_DATA ['seq' ].copy ()[::2 ]
317
- seq = getattr (seq , op )(seq )
318
- assert_true (seq is seq_orig )
319
- check_arr_seq (seq , [getattr (d .copy (), op )(d ) for d in SEQ_DATA ['data' ][::2 ]])
295
+ check_arr_seq (seq , [getattr (d , op )() for d in orig ])
296
+
297
+ def _test_binary (op , arrseq , scalars , seqs , inplace = False ):
298
+ for scalar in scalars :
299
+ orig = arrseq .copy ()
300
+ seq = getattr (orig , op )(scalar )
301
+ assert_true ((seq is orig ) if inplace else (seq is not orig ))
302
+ check_arr_seq (seq , [getattr (e , op )(scalar ) for e in arrseq ])
303
+
304
+ # Test math operators with another ArraySequence.
305
+ for other in seqs :
306
+ orig = arrseq .copy ()
307
+ seq = getattr (orig , op )(other )
308
+ assert_true (seq is not SEQ_DATA ['seq' ])
309
+ check_arr_seq (seq , [getattr (e1 , op )(e2 ) for e1 , e2 in zip (arrseq , other )])
320
310
321
311
# Operations between array sequences of different lengths.
322
- seq = SEQ_DATA [ 'seq' ] .copy ()
323
- assert_raises (ValueError , getattr (seq , op ), SEQ_DATA [ 'seq' ] [::2 ])
312
+ orig = arrseq .copy ()
313
+ assert_raises (ValueError , getattr (orig , op ), orig [::2 ])
324
314
325
315
# Operations between array sequences with different amount of data.
326
316
seq1 = ArraySequence (np .arange (10 ).reshape (5 , 2 ))
@@ -332,11 +322,59 @@ def test_arraysequence_operators(self):
332
322
seq2 = ArraySequence (np .arange (8 ).reshape (2 , 2 , 2 ))
333
323
assert_raises (ValueError , getattr (seq1 , op ), seq2 )
334
324
325
+
326
+ for op in ["__add__" , "__sub__" , "__mul__" , "__mod__" ,
327
+ "__floordiv__" , "__truediv__" ] + CMP_OPS :
328
+ _test_binary (op , seq , SCALARS , ARRSEQS )
329
+ _test_binary (op , seq_int , SCALARS , ARRSEQS )
330
+
331
+ # Test math operators with ArraySequence views.
332
+ _test_binary (op , seq [::2 ], SCALARS , VIEWS )
333
+ _test_binary (op , seq_int [::2 ], SCALARS , VIEWS )
334
+
335
+ if op in CMP_OPS :
336
+ continue
337
+
338
+ op = "__i{}__" .format (op .strip ("_" ))
339
+ _test_binary (op , seq , SCALARS , ARRSEQS , inplace = True )
340
+
341
+ if op == "__itruediv__" :
342
+ continue # Going to deal with it separately.
343
+
344
+ _test_binary (op , seq_int , [42 , - 3 , True , 0 ], [seq_int , seq_bool , - seq_int ], inplace = True ) # int <-- int
345
+ assert_raises (TypeError , _test_binary , op , seq_int , [0.5 ], [], inplace = True ) # int <-- float
346
+ assert_raises (TypeError , _test_binary , op , seq_int , [], [seq ], inplace = True ) # int <-- float
347
+
348
+ # __pow__ : Integers to negative integer powers are not allowed.
349
+ _test_binary ("__pow__" , seq , [42 , - 3 , True , 0 ], [seq_int , seq_bool , - seq_int ])
350
+ _test_binary ("__ipow__" , seq , [42 , - 3 , True , 0 ], [seq_int , seq_bool , - seq_int ], inplace = True )
351
+ assert_raises (ValueError , _test_binary , "__pow__" , seq_int , [- 3 ], [])
352
+ assert_raises (ValueError , _test_binary , "__ipow__" , seq_int , [- 3 ], [], inplace = True )
353
+
354
+ # __itruediv__ is only valid with float arrseq.
355
+ for scalar in SCALARS + ARRSEQS :
356
+ assert_raises (TypeError , getattr (seq_int .copy (), "__itruediv__" ), scalar )
357
+
358
+ # Bitwise operators
359
+ for op in ("__lshift__" , "__rshift__" , "__or__" , "__and__" , "__xor__" ):
360
+ _test_binary (op , seq_bool , [42 , - 3 , True , 0 ], [seq_int , seq_bool , - seq_int ])
361
+ assert_raises (TypeError , _test_binary , op , seq_bool , [0.5 ], [])
362
+ assert_raises (TypeError , _test_binary , op , seq , [], [seq ])
363
+
335
364
# Unary operators
336
- for op in ["__neg__" ]:
337
- seq = getattr (SEQ_DATA ['seq' ], op )()
338
- assert_true (seq is not SEQ_DATA ['seq' ])
339
- check_arr_seq (seq , [getattr (d , op )() for d in SEQ_DATA ['data' ]])
365
+ for op in ["__neg__" , "__abs__" ]:
366
+ _test_unary (op , seq )
367
+ _test_unary (op , - seq )
368
+ _test_unary (op , seq_int )
369
+ _test_unary (op , - seq_int )
370
+
371
+ _test_unary ("__abs__" , seq_bool )
372
+ _test_unary ("__invert__" , seq_bool )
373
+ assert_raises (TypeError , _test_unary , "__invert__" , seq )
374
+
375
+ # Restore flags.
376
+ np .seterr (** flags )
377
+
340
378
341
379
def test_arraysequence_setitem (self ):
342
380
# Set one item
@@ -346,13 +384,6 @@ def test_arraysequence_setitem(self):
346
384
347
385
check_arr_seq (seq , SEQ_DATA ['seq' ])
348
386
349
- if sys .version_info < (3 ,):
350
- seq = ArraySequence (SEQ_DATA ['seq' ] * 0 )
351
- for i , e in enumerate (SEQ_DATA ['seq' ]):
352
- seq [long (i )] = e
353
-
354
- check_arr_seq (seq , SEQ_DATA ['seq' ])
355
-
356
387
# Get all items using indexing (creates a view).
357
388
indices = list (range (len (SEQ_DATA ['seq' ])))
358
389
seq_view = SEQ_DATA ['seq' ][indices ]
0 commit comments