Skip to content

Commit b469ed7

Browse files
authored
Merge pull request #1594 from IntelPython/broadcast_arrays
Implemented dpnp.broadcast_arrays function.
2 parents c1bf9ac + 3432716 commit b469ed7

File tree

5 files changed

+220
-48
lines changed

5 files changed

+220
-48
lines changed

dpnp/dpnp_iface_manipulation.py

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"atleast_1d",
5555
"atleast_2d",
5656
"atleast_3d",
57+
"broadcast_arrays",
5758
"broadcast_to",
5859
"concatenate",
5960
"copyto",
@@ -309,6 +310,55 @@ def atleast_3d(*arys):
309310
return res
310311

311312

313+
def broadcast_arrays(*args, subok=False):
314+
"""
315+
Broadcast any number of arrays against each other.
316+
317+
For full documentation refer to :obj:`numpy.broadcast_arrays`.
318+
319+
Returns
320+
-------
321+
broadcasted : list of dpnp.ndarray
322+
These arrays are views on the original arrays.
323+
324+
Limitations
325+
-----------
326+
Parameter `args` is supported as either :class:`dpnp.ndarray`
327+
or :class:`dpctl.tensor.usm_ndarray`.
328+
Otherwise ``TypeError`` exception will be raised.
329+
Parameter `subok` is supported with default value.
330+
Otherwise ``NotImplementedError`` exception will be raised.
331+
332+
See Also
333+
--------
334+
:obj:`dpnp.broadcast_to` : Broadcast an array to a new shape.
335+
336+
Examples
337+
--------
338+
>>> import dpnp as np
339+
>>> x = np.array([[1, 2, 3]])
340+
>>> y = np.array([[4], [5]])
341+
>>> np.broadcast_arrays(x, y)
342+
[array([[1, 2, 3],
343+
[1, 2, 3]]), array([[4, 4, 4],
344+
[5, 5, 5]])]
345+
346+
"""
347+
348+
if subok is not False:
349+
raise NotImplementedError(f"subok={subok} is currently not supported")
350+
351+
if len(args) == 0:
352+
return []
353+
354+
dpt_arrays = dpt.broadcast_arrays(
355+
*[dpnp.get_usm_ndarray(array) for array in args]
356+
)
357+
return [
358+
dpnp_array._create_from_usm_ndarray(usm_arr) for usm_arr in dpt_arrays
359+
]
360+
361+
312362
def broadcast_to(array, /, shape, subok=False):
313363
"""
314364
Broadcast an array to a new shape.
@@ -324,10 +374,15 @@ def broadcast_to(array, /, shape, subok=False):
324374
-----------
325375
Parameter `array` is supported as either :class:`dpnp.ndarray`
326376
or :class:`dpctl.tensor.usm_ndarray`.
377+
Otherwise ``TypeError`` exception will be raised.
327378
Parameter `subok` is supported with default value.
328-
Otherwise the function will be executed sequentially on CPU.
379+
Otherwise ``NotImplementedError`` exception will be raised.
329380
Input array data types of `array` is limited by supported DPNP :ref:`Data types`.
330381
382+
See Also
383+
--------
384+
:obj:`dpnp.broadcast_arrays` : Broadcast any number of arrays against each other.
385+
331386
Examples
332387
--------
333388
>>> import dpnp as dp
@@ -340,13 +395,11 @@ def broadcast_to(array, /, shape, subok=False):
340395
"""
341396

342397
if subok is not False:
343-
pass
344-
elif dpnp.is_supported_array_type(array):
345-
dpt_array = dpnp.get_usm_ndarray(array)
346-
new_array = dpt.broadcast_to(dpt_array, shape)
347-
return dpnp_array._create_from_usm_ndarray(new_array)
398+
raise NotImplementedError(f"subok={subok} is currently not supported")
348399

349-
return call_origin(numpy.broadcast_to, array, shape=shape, subok=subok)
400+
dpt_array = dpnp.get_usm_ndarray(array)
401+
new_array = dpt.broadcast_to(dpt_array, shape)
402+
return dpnp_array._create_from_usm_ndarray(new_array)
350403

351404

352405
def concatenate(
@@ -367,7 +420,7 @@ def concatenate(
367420
Each array in `arrays` is supported as either :class:`dpnp.ndarray`
368421
or :class:`dpctl.tensor.usm_ndarray`. Otherwise ``TypeError`` exception
369422
will be raised.
370-
Parameters `out` and `dtype are supported with default value.
423+
Parameters `out` and `dtype` are supported with default value.
371424
Otherwise the function will be executed sequentially on CPU.
372425
373426
See Also

tests/skipped_tests.tbl

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ tests/third_party/cupy/core_tests/test_ndarray_conversion.py::TestNdarrayToBytes
119119
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype
120120
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_type
121121
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_strides
122-
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_strides_broadcast
123122
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_strides_negative
124123
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_strides_swapped
125124
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_type_c_contiguous_no_copy
@@ -427,35 +426,20 @@ tests/third_party/cupy/logic_tests/test_comparison.py::TestArrayEqual::test_arra
427426
tests/third_party/cupy/logic_tests/test_comparison.py::TestArrayEqual::test_array_equal_not_equal
428427

429428
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_0_{shapes=[(), ()]}::test_broadcast
430-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_0_{shapes=[(), ()]}::test_broadcast_arrays
431429
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_10_{shapes=[(0, 1, 1, 0, 3), (5, 2, 0, 1, 0, 0, 3), (2, 1, 0, 0, 0, 3)]}::test_broadcast
432-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_10_{shapes=[(0, 1, 1, 0, 3), (5, 2, 0, 1, 0, 0, 3), (2, 1, 0, 0, 0, 3)]}::test_broadcast_arrays
433430
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_1_{shapes=[(0,), (0,)]}::test_broadcast
434-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_1_{shapes=[(0,), (0,)]}::test_broadcast_arrays
435431
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_2_{shapes=[(1,), (1,)]}::test_broadcast
436-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_2_{shapes=[(1,), (1,)]}::test_broadcast_arrays
437432
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_3_{shapes=[(2,), (2,)]}::test_broadcast
438-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_3_{shapes=[(2,), (2,)]}::test_broadcast_arrays
439433
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_4_{shapes=[(0,), (1,)]}::test_broadcast
440-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_4_{shapes=[(0,), (1,)]}::test_broadcast_arrays
441434
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_5_{shapes=[(2, 3), (1, 3)]}::test_broadcast
442-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_5_{shapes=[(2, 3), (1, 3)]}::test_broadcast_arrays
443435
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_6_{shapes=[(2, 1, 3, 4), (3, 1, 4)]}::test_broadcast
444-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_6_{shapes=[(2, 1, 3, 4), (3, 1, 4)]}::test_broadcast_arrays
445436
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_7_{shapes=[(4, 3, 2, 3), (2, 3)]}::test_broadcast
446-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_7_{shapes=[(4, 3, 2, 3), (2, 3)]}::test_broadcast_arrays
447437
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_8_{shapes=[(2, 0, 1, 1, 3), (2, 1, 0, 0, 3)]}::test_broadcast
448-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_8_{shapes=[(2, 0, 1, 1, 3), (2, 1, 0, 0, 3)]}::test_broadcast_arrays
449438
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_9_{shapes=[(0, 1, 1, 3), (2, 1, 0, 0, 3)]}::test_broadcast
450-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_9_{shapes=[(0, 1, 1, 3), (2, 1, 0, 0, 3)]}::test_broadcast_arrays
451439
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_0_{shapes=[(3,), (2,)]}::test_invalid_broadcast
452-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_0_{shapes=[(3,), (2,)]}::test_invalid_broadcast_arrays
453440
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_1_{shapes=[(3, 2), (2, 3)]}::test_invalid_broadcast
454-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_1_{shapes=[(3, 2), (2, 3)]}::test_invalid_broadcast_arrays
455441
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_2_{shapes=[(3, 2), (3, 4)]}::test_invalid_broadcast
456-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_2_{shapes=[(3, 2), (3, 4)]}::test_invalid_broadcast_arrays
457442
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_3_{shapes=[(0,), (2,)]}::test_invalid_broadcast
458-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_3_{shapes=[(0,), (2,)]}::test_invalid_broadcast_arrays
459443

460444
tests/third_party/cupy/manipulation_tests/test_shape.py::TestRavel::test_ravel2
461445
tests/third_party/cupy/manipulation_tests/test_shape.py::TestRavel::test_ravel3

tests/skipped_tests_gpu.tbl

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,6 @@ tests/third_party/cupy/core_tests/test_ndarray_complex_ops.py::TestScalarConvers
248248
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype
249249
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_type
250250
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_strides
251-
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_strides_broadcast
252251
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_strides_negative
253252
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_strides_swapped
254253
tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py::TestArrayCopyAndView::test_astype_type_c_contiguous_no_copy
@@ -572,36 +571,21 @@ tests/third_party/cupy/logic_tests/test_comparison.py::TestArrayEqual::test_arra
572571
tests/third_party/cupy/logic_tests/test_comparison.py::TestArrayEqual::test_array_equal_not_equal
573572

574573
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_0_{shapes=[(), ()]}::test_broadcast
575-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_0_{shapes=[(), ()]}::test_broadcast_arrays
576574
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_10_{shapes=[(0, 1, 1, 0, 3), (5, 2, 0, 1, 0, 0, 3), (2, 1, 0, 0, 0, 3)]}::test_broadcast
577-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_10_{shapes=[(0, 1, 1, 0, 3), (5, 2, 0, 1, 0, 0, 3), (2, 1, 0, 0, 0, 3)]}::test_broadcast_arrays
578575
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_1_{shapes=[(0,), (0,)]}::test_broadcast
579-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_1_{shapes=[(0,), (0,)]}::test_broadcast_arrays
580576
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_2_{shapes=[(1,), (1,)]}::test_broadcast
581-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_2_{shapes=[(1,), (1,)]}::test_broadcast_arrays
582577
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_3_{shapes=[(2,), (2,)]}::test_broadcast
583-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_3_{shapes=[(2,), (2,)]}::test_broadcast_arrays
584578
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_4_{shapes=[(0,), (1,)]}::test_broadcast
585-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_4_{shapes=[(0,), (1,)]}::test_broadcast_arrays
586579
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_5_{shapes=[(2, 3), (1, 3)]}::test_broadcast
587-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_5_{shapes=[(2, 3), (1, 3)]}::test_broadcast_arrays
588580
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_6_{shapes=[(2, 1, 3, 4), (3, 1, 4)]}::test_broadcast
589-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_6_{shapes=[(2, 1, 3, 4), (3, 1, 4)]}::test_broadcast_arrays
590581
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_7_{shapes=[(4, 3, 2, 3), (2, 3)]}::test_broadcast
591-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_7_{shapes=[(4, 3, 2, 3), (2, 3)]}::test_broadcast_arrays
592582
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_8_{shapes=[(2, 0, 1, 1, 3), (2, 1, 0, 0, 3)]}::test_broadcast
593-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_8_{shapes=[(2, 0, 1, 1, 3), (2, 1, 0, 0, 3)]}::test_broadcast_arrays
594583
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_9_{shapes=[(0, 1, 1, 3), (2, 1, 0, 0, 3)]}::test_broadcast
595-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestBroadcast_param_9_{shapes=[(0, 1, 1, 3), (2, 1, 0, 0, 3)]}::test_broadcast_arrays
596-
597584
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_0_{shapes=[(3,), (2,)]}::test_invalid_broadcast
598-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_0_{shapes=[(3,), (2,)]}::test_invalid_broadcast_arrays
599585
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_1_{shapes=[(3, 2), (2, 3)]}::test_invalid_broadcast
600-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_1_{shapes=[(3, 2), (2, 3)]}::test_invalid_broadcast_arrays
601586
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_2_{shapes=[(3, 2), (3, 4)]}::test_invalid_broadcast
602-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_2_{shapes=[(3, 2), (3, 4)]}::test_invalid_broadcast_arrays
603587
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_3_{shapes=[(0,), (2,)]}::test_invalid_broadcast
604-
tests/third_party/cupy/manipulation_tests/test_dims.py::TestInvalidBroadcast_param_3_{shapes=[(0,), (2,)]}::test_invalid_broadcast_arrays
588+
605589
tests/third_party/cupy/manipulation_tests/test_shape.py::TestRavel::test_ravel2
606590
tests/third_party/cupy/manipulation_tests/test_shape.py::TestRavel::test_ravel3
607591
tests/third_party/cupy/manipulation_tests/test_shape.py::TestRavel::test_external_ravel

tests/test_arraymanipulation.py

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,3 +778,153 @@ def test_3D_array(self):
778778
res = [dpnp.atleast_3d(a), dpnp.atleast_3d(b)]
779779
desired = [a, b]
780780
assert_array_equal(res, desired)
781+
782+
783+
def assert_broadcast_correct(input_shapes):
784+
np_arrays = [numpy.zeros(s, dtype="i1") for s in input_shapes]
785+
out_np_arrays = numpy.broadcast_arrays(*np_arrays)
786+
dpnp_arrays = [dpnp.asarray(Xnp) for Xnp in np_arrays]
787+
out_dpnp_arrays = dpnp.broadcast_arrays(*dpnp_arrays)
788+
for Xnp, X in zip(out_np_arrays, out_dpnp_arrays):
789+
assert_array_equal(
790+
Xnp, dpnp.asnumpy(X), err_msg=f"Failed for {input_shapes})"
791+
)
792+
793+
794+
def assert_broadcast_arrays_raise(input_shapes):
795+
dpnp_arrays = [dpnp.asarray(numpy.zeros(s)) for s in input_shapes]
796+
pytest.raises(ValueError, dpnp.broadcast_arrays, *dpnp_arrays)
797+
798+
799+
def test_broadcast_arrays_same():
800+
Xnp = numpy.arange(10)
801+
Ynp = numpy.arange(10)
802+
res_Xnp, res_Ynp = numpy.broadcast_arrays(Xnp, Ynp)
803+
X = dpnp.asarray(Xnp)
804+
Y = dpnp.asarray(Ynp)
805+
res_X, res_Y = dpnp.broadcast_arrays(X, Y)
806+
assert_array_equal(res_Xnp, dpnp.asnumpy(res_X))
807+
assert_array_equal(res_Ynp, dpnp.asnumpy(res_Y))
808+
809+
810+
def test_broadcast_arrays_one_off():
811+
Xnp = numpy.array([[1, 2, 3]])
812+
Ynp = numpy.array([[1], [2], [3]])
813+
res_Xnp, res_Ynp = numpy.broadcast_arrays(Xnp, Ynp)
814+
X = dpnp.asarray(Xnp)
815+
Y = dpnp.asarray(Ynp)
816+
res_X, res_Y = dpnp.broadcast_arrays(X, Y)
817+
assert_array_equal(res_Xnp, dpnp.asnumpy(res_X))
818+
assert_array_equal(res_Ynp, dpnp.asnumpy(res_Y))
819+
820+
821+
@pytest.mark.parametrize(
822+
"shapes",
823+
[
824+
(),
825+
(1,),
826+
(3,),
827+
(0, 1),
828+
(0, 3),
829+
(1, 0),
830+
(3, 0),
831+
(1, 3),
832+
(3, 1),
833+
(3, 3),
834+
],
835+
)
836+
def test_broadcast_arrays_same_shapes(shapes):
837+
for shape in shapes:
838+
single_input_shapes = [shape]
839+
assert_broadcast_correct(single_input_shapes)
840+
double_input_shapes = [shape, shape]
841+
assert_broadcast_correct(double_input_shapes)
842+
triple_input_shapes = [shape, shape, shape]
843+
assert_broadcast_correct(triple_input_shapes)
844+
845+
846+
@pytest.mark.parametrize(
847+
"shapes",
848+
[
849+
[[(1,), (3,)]],
850+
[[(1, 3), (3, 3)]],
851+
[[(3, 1), (3, 3)]],
852+
[[(1, 3), (3, 1)]],
853+
[[(1, 1), (3, 3)]],
854+
[[(1, 1), (1, 3)]],
855+
[[(1, 1), (3, 1)]],
856+
[[(1, 0), (0, 0)]],
857+
[[(0, 1), (0, 0)]],
858+
[[(1, 0), (0, 1)]],
859+
[[(1, 1), (0, 0)]],
860+
[[(1, 1), (1, 0)]],
861+
[[(1, 1), (0, 1)]],
862+
],
863+
)
864+
def test_broadcast_arrays_same_len_shapes(shapes):
865+
# Check that two different input shapes of the same length, but some have
866+
# ones, broadcast to the correct shape.
867+
868+
for input_shapes in shapes:
869+
assert_broadcast_correct(input_shapes)
870+
assert_broadcast_correct(input_shapes[::-1])
871+
872+
873+
@pytest.mark.parametrize(
874+
"shapes",
875+
[
876+
[[(), (3,)]],
877+
[[(3,), (3, 3)]],
878+
[[(3,), (3, 1)]],
879+
[[(1,), (3, 3)]],
880+
[[(), (3, 3)]],
881+
[[(1, 1), (3,)]],
882+
[[(1,), (3, 1)]],
883+
[[(1,), (1, 3)]],
884+
[[(), (1, 3)]],
885+
[[(), (3, 1)]],
886+
[[(), (0,)]],
887+
[[(0,), (0, 0)]],
888+
[[(0,), (0, 1)]],
889+
[[(1,), (0, 0)]],
890+
[[(), (0, 0)]],
891+
[[(1, 1), (0,)]],
892+
[[(1,), (0, 1)]],
893+
[[(1,), (1, 0)]],
894+
[[(), (1, 0)]],
895+
[[(), (0, 1)]],
896+
],
897+
)
898+
def test_broadcast_arrays_different_len_shapes(shapes):
899+
# Check that two different input shapes (of different lengths) broadcast
900+
# to the correct shape.
901+
902+
for input_shapes in shapes:
903+
assert_broadcast_correct(input_shapes)
904+
assert_broadcast_correct(input_shapes[::-1])
905+
906+
907+
@pytest.mark.parametrize(
908+
"shapes",
909+
[
910+
[[(3,), (4,)]],
911+
[[(2, 3), (2,)]],
912+
[[(3,), (3,), (4,)]],
913+
[[(1, 3, 4), (2, 3, 3)]],
914+
],
915+
)
916+
def test_incompatible_shapes_raise_valueerror(shapes):
917+
for input_shapes in shapes:
918+
assert_broadcast_arrays_raise(input_shapes)
919+
assert_broadcast_arrays_raise(input_shapes[::-1])
920+
921+
922+
def test_broadcast_arrays_empty_input():
923+
assert dpnp.broadcast_arrays() == []
924+
925+
926+
def test_subok_error():
927+
x = dpnp.ones((4))
928+
with pytest.raises(NotImplementedError):
929+
dpnp.broadcast_arrays(x, subok=True)
930+
dpnp.broadcast_to(x, (4, 4), subok=True)

tests/third_party/cupy/core_tests/test_ndarray_copy_and_view.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,14 @@ def test_astype_strides_swapped(self, xp, src_dtype, dst_dtype):
157157
@testing.for_all_dtypes_combination(("src_dtype", "dst_dtype"))
158158
@testing.numpy_cupy_array_equal()
159159
def test_astype_strides_broadcast(self, xp, src_dtype, dst_dtype):
160-
src, _ = xp.broadcast_arrays(
161-
xp.empty((2,), dtype=src_dtype),
162-
xp.empty((2, 3, 2), dtype=src_dtype),
163-
)
164-
return numpy.array(
165-
astype_without_warning(src, dst_dtype, order="K").strides
166-
)
160+
src1 = testing.shaped_arange((2, 3, 2), xp, dtype=src_dtype)
161+
src2 = testing.shaped_arange((2,), xp, dtype=src_dtype)
162+
src, _ = xp.broadcast_arrays(src1, src2)
163+
dst = astype_without_warning(src, dst_dtype, order="K")
164+
strides = dst.strides
165+
if xp is numpy:
166+
strides = tuple(x // dst.itemsize for x in strides)
167+
return strides
167168

168169
@pytest.mark.usefixtures("allow_fall_back_on_numpy")
169170
@testing.for_all_dtypes()

0 commit comments

Comments
 (0)