@@ -535,6 +535,90 @@ def test_broadcast(self, arr_dt, idx_dt):
535
535
assert_array_equal (np_a , dp_a )
536
536
537
537
538
+ class TestTake :
539
+ @pytest .mark .parametrize ("a_dt" , get_all_dtypes (no_none = True ))
540
+ @pytest .mark .parametrize ("ind_dt" , get_all_dtypes (no_none = True ))
541
+ @pytest .mark .parametrize (
542
+ "indices" , [[- 2 , 2 ], [- 5 , 4 ]], ids = ["[-2, 2]" , "[-5, 4]" ]
543
+ )
544
+ @pytest .mark .parametrize ("mode" , ["clip" , "wrap" ])
545
+ def test_1d (self , a_dt , ind_dt , indices , mode ):
546
+ a = numpy .array ([- 2 , - 1 , 0 , 1 , 2 ], dtype = a_dt )
547
+ ind = numpy .array (indices , dtype = ind_dt )
548
+ ia , iind = dpnp .array (a ), dpnp .array (ind )
549
+
550
+ if numpy .can_cast (ind_dt , numpy .intp , casting = "safe" ):
551
+ result = dpnp .take (ia , iind , mode = mode )
552
+ expected = numpy .take (a , ind , mode = mode )
553
+ assert_array_equal (result , expected )
554
+ else :
555
+ assert_raises (TypeError , ia .take , iind , mode = mode )
556
+ assert_raises (TypeError , a .take , ind , mode = mode )
557
+
558
+ @pytest .mark .parametrize ("a_dt" , get_all_dtypes (no_none = True ))
559
+ @pytest .mark .parametrize ("ind_dt" , get_integer_dtypes ())
560
+ @pytest .mark .parametrize (
561
+ "indices" , [[- 1 , 0 ], [- 3 , 2 ]], ids = ["[-1, 0]" , "[-3, 2]" ]
562
+ )
563
+ @pytest .mark .parametrize ("mode" , ["clip" , "wrap" ])
564
+ @pytest .mark .parametrize ("axis" , [0 , 1 ], ids = ["0" , "1" ])
565
+ def test_2d (self , a_dt , ind_dt , indices , mode , axis ):
566
+ a = numpy .array ([[- 1 , 0 , 1 ], [- 2 , - 3 , - 4 ], [2 , 3 , 4 ]], dtype = a_dt )
567
+ ind = numpy .array (indices , dtype = ind_dt )
568
+ ia , iind = dpnp .array (a ), dpnp .array (ind )
569
+
570
+ result = ia .take (iind , axis = axis , mode = mode )
571
+ expected = a .take (ind , axis = axis , mode = mode )
572
+ assert_array_equal (result , expected )
573
+
574
+ @pytest .mark .parametrize ("a_dt" , get_all_dtypes (no_none = True ))
575
+ @pytest .mark .parametrize ("indices" , [[- 5 , 5 ]], ids = ["[-5, 5]" ])
576
+ @pytest .mark .parametrize ("mode" , ["clip" , "wrap" ])
577
+ def test_over_index (self , a_dt , indices , mode ):
578
+ a = dpnp .array ([- 2 , - 1 , 0 , 1 , 2 ], dtype = a_dt )
579
+ ind = dpnp .array (indices , dtype = numpy .intp )
580
+
581
+ result = dpnp .take (a , ind , mode = mode )
582
+ expected = dpnp .array ([- 2 , 2 ], dtype = a .dtype )
583
+ assert_array_equal (result , expected )
584
+
585
+ @pytest .mark .parametrize ("xp" , [numpy , dpnp ])
586
+ @pytest .mark .parametrize ("indices" , [[0 ], [1 ]], ids = ["[0]" , "[1]" ])
587
+ @pytest .mark .parametrize ("mode" , ["clip" , "wrap" ])
588
+ def test_index_error (self , xp , indices , mode ):
589
+ # take from a 0-length dimension
590
+ a = xp .empty ((2 , 3 , 0 , 4 ))
591
+ assert_raises (IndexError , a .take , indices , axis = 2 , mode = mode )
592
+
593
+ def test_bool_axis (self ):
594
+ a = numpy .array ([[[1 ]]])
595
+ ia = dpnp .array (a )
596
+
597
+ result = ia .take ([0 ], axis = False )
598
+ expected = a .take ([0 ], axis = 0 ) # numpy raises an error for bool axis
599
+ assert_array_equal (result , expected )
600
+
601
+ def test_axis_as_array (self ):
602
+ a = numpy .array ([[[1 ]]])
603
+ ia = dpnp .array (a )
604
+
605
+ result = ia .take ([0 ], axis = ia )
606
+ expected = a .take (
607
+ [0 ], axis = 1
608
+ ) # numpy raises an error for axis as array
609
+ assert_array_equal (result , expected )
610
+
611
+ def test_mode_raise (self ):
612
+ a = dpnp .array ([[1 , 2 ], [3 , 4 ]])
613
+ assert_raises (ValueError , a .take , [- 1 , 4 ], mode = "raise" )
614
+
615
+ @pytest .mark .parametrize ("xp" , [numpy , dpnp ])
616
+ def test_unicode_mode (self , xp ):
617
+ a = xp .arange (10 )
618
+ k = b"\xc3 \xa4 " .decode ("UTF8" )
619
+ assert_raises (ValueError , a .take , 5 , mode = k )
620
+
621
+
538
622
class TestTakeAlongAxis :
539
623
@pytest .mark .parametrize (
540
624
"func, argfunc, kwargs" ,
@@ -964,54 +1048,6 @@ def test_select():
964
1048
assert_array_equal (expected , result )
965
1049
966
1050
967
- @pytest .mark .parametrize ("array_type" , get_all_dtypes ())
968
- @pytest .mark .parametrize (
969
- "indices_type" , [numpy .int32 , numpy .int64 ], ids = ["int32" , "int64" ]
970
- )
971
- @pytest .mark .parametrize (
972
- "indices" , [[- 2 , 2 ], [- 5 , 4 ]], ids = ["[-2, 2]" , "[-5, 4]" ]
973
- )
974
- @pytest .mark .parametrize ("mode" , ["clip" , "wrap" ], ids = ["clip" , "wrap" ])
975
- def test_take_1d (indices , array_type , indices_type , mode ):
976
- a = numpy .array ([- 2 , - 1 , 0 , 1 , 2 ], dtype = array_type )
977
- ind = numpy .array (indices , dtype = indices_type )
978
- ia = dpnp .array (a )
979
- iind = dpnp .array (ind )
980
- expected = numpy .take (a , ind , mode = mode )
981
- result = dpnp .take (ia , iind , mode = mode )
982
- assert_array_equal (expected , result )
983
-
984
-
985
- @pytest .mark .parametrize ("array_type" , get_all_dtypes ())
986
- @pytest .mark .parametrize (
987
- "indices_type" , [numpy .int32 , numpy .int64 ], ids = ["int32" , "int64" ]
988
- )
989
- @pytest .mark .parametrize (
990
- "indices" , [[- 1 , 0 ], [- 3 , 2 ]], ids = ["[-1, 0]" , "[-3, 2]" ]
991
- )
992
- @pytest .mark .parametrize ("mode" , ["clip" , "wrap" ], ids = ["clip" , "wrap" ])
993
- @pytest .mark .parametrize ("axis" , [0 , 1 ], ids = ["0" , "1" ])
994
- def test_take_2d (indices , array_type , indices_type , axis , mode ):
995
- a = numpy .array ([[- 1 , 0 , 1 ], [- 2 , - 3 , - 4 ], [2 , 3 , 4 ]], dtype = array_type )
996
- ind = numpy .array (indices , dtype = indices_type )
997
- ia = dpnp .array (a )
998
- iind = dpnp .array (ind )
999
- expected = numpy .take (a , ind , axis = axis , mode = mode )
1000
- result = dpnp .take (ia , iind , axis = axis , mode = mode )
1001
- assert_array_equal (expected , result )
1002
-
1003
-
1004
- @pytest .mark .parametrize ("array_type" , get_all_dtypes ())
1005
- @pytest .mark .parametrize ("indices" , [[- 5 , 5 ]], ids = ["[-5, 5]" ])
1006
- @pytest .mark .parametrize ("mode" , ["clip" , "wrap" ], ids = ["clip" , "wrap" ])
1007
- def test_take_over_index (indices , array_type , mode ):
1008
- a = dpnp .array ([- 2 , - 1 , 0 , 1 , 2 ], dtype = array_type )
1009
- ind = dpnp .array (indices , dtype = dpnp .int64 )
1010
- expected = dpnp .array ([- 2 , 2 ], dtype = a .dtype )
1011
- result = dpnp .take (a , ind , mode = mode )
1012
- assert_array_equal (expected , result )
1013
-
1014
-
1015
1051
@pytest .mark .parametrize (
1016
1052
"m" , [None , 0 , 1 , 2 , 3 , 4 ], ids = ["None" , "0" , "1" , "2" , "3" , "4" ]
1017
1053
)
0 commit comments