@@ -24,7 +24,7 @@ def setup():
2424
2525
2626def 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
2828 for _ in range (nb_arrays )]
2929 return data
3030
@@ -228,9 +228,6 @@ def test_arraysequence_getitem(self):
228228 for i , e in enumerate (SEQ_DATA ['seq' ]):
229229 assert_array_equal (SEQ_DATA ['seq' ][i ], e )
230230
231- if sys .version_info < (3 ,):
232- assert_array_equal (SEQ_DATA ['seq' ][long (i )], e )
233-
234231 # Get all items using indexing (creates a view).
235232 indices = list (range (len (SEQ_DATA ['seq' ])))
236233 seq_view = SEQ_DATA ['seq' ][indices ]
@@ -278,49 +275,42 @@ def test_arraysequence_getitem(self):
278275 check_arr_seq (seq_view , [d [:, 2 ] for d in SEQ_DATA ['data' ][::- 2 ]])
279276
280277 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__" ]
288282
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
293287
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 )()
297294 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 )])
320310
321311 # 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 ])
324314
325315 # Operations between array sequences with different amount of data.
326316 seq1 = ArraySequence (np .arange (10 ).reshape (5 , 2 ))
@@ -332,11 +322,59 @@ def test_arraysequence_operators(self):
332322 seq2 = ArraySequence (np .arange (8 ).reshape (2 , 2 , 2 ))
333323 assert_raises (ValueError , getattr (seq1 , op ), seq2 )
334324
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+
335364 # 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+
340378
341379 def test_arraysequence_setitem (self ):
342380 # Set one item
@@ -346,13 +384,6 @@ def test_arraysequence_setitem(self):
346384
347385 check_arr_seq (seq , SEQ_DATA ['seq' ])
348386
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-
356387 # Get all items using indexing (creates a view).
357388 indices = list (range (len (SEQ_DATA ['seq' ])))
358389 seq_view = SEQ_DATA ['seq' ][indices ]
0 commit comments