@@ -349,6 +349,31 @@ def _copy_from_usm_ndarray_to_usm_ndarray(dst, src):
349349 _copy_same_shape (dst , src_same_shape )
350350
351351
352+ def _make_empty_like_orderK (X , dt , usm_type , dev ):
353+ st = list (X .strides )
354+ perm = sorted (
355+ range (X .ndim ),
356+ key = lambda d : builtins .abs (st [d ]) if X .shape [d ] > 1 else 0 ,
357+ reverse = True ,
358+ )
359+ inv_perm = sorted (range (X .ndim ), key = lambda i : perm [i ])
360+ sh = X .shape
361+ sh_sorted = tuple (sh [i ] for i in perm )
362+ R = dpt .empty (sh_sorted , dtype = dt , usm_type = usm_type , device = dev , order = "C" )
363+ if min (st ) < 0 :
364+ st_sorted = [st [i ] for i in perm ]
365+ sl = tuple (
366+ (
367+ slice (None , None , - 1 )
368+ if st_sorted [i ] < 0
369+ else slice (None , None , None )
370+ )
371+ for i in range (X .ndim )
372+ )
373+ R = R [sl ]
374+ return dpt .permute_dims (R , inv_perm )
375+
376+
352377def _empty_like_orderK (X , dt , usm_type = None , dev = None ):
353378 """Returns empty array like `x`, using order='K'
354379
@@ -371,28 +396,28 @@ def _empty_like_orderK(X, dt, usm_type=None, dev=None):
371396 return dpt .empty_like (
372397 X , dtype = dt , usm_type = usm_type , device = dev , order = "F"
373398 )
374- st = list (X .strides )
375- perm = sorted (
376- range (X .ndim ),
377- key = lambda d : builtins .abs (st [d ]) if X .shape [d ] > 1 else 0 ,
378- reverse = True ,
379- )
380- inv_perm = sorted (range (X .ndim ), key = lambda i : perm [i ])
381- sh = X .shape
382- sh_sorted = tuple (sh [i ] for i in perm )
383- R = dpt .empty (sh_sorted , dtype = dt , usm_type = usm_type , device = dev , order = "C" )
384- if min (st ) < 0 :
385- st_sorted = [st [i ] for i in perm ]
386- sl = tuple (
387- (
388- slice (None , None , - 1 )
389- if st_sorted [i ] < 0
390- else slice (None , None , None )
391- )
392- for i in range (X .ndim )
399+ return _make_empty_like_orderK (X , dt , usm_type , dev )
400+
401+
402+ def _from_numpy_empty_like_orderK (X , dt , usm_type , dev ):
403+ """Returns empty usm_ndarray like NumPy array `x`, using order='K'
404+
405+ For an array `x` that was obtained by permutation of a contiguous
406+ array the returned array will have the same shape and the same
407+ strides as `x`.
408+ """
409+ if not isinstance (X , np .ndarray ):
410+ raise TypeError (f"Expected np.ndarray, got { type (X )} " )
411+ fl = X .flags
412+ if fl ["C" ] or X .size <= 1 :
413+ return dpt .empty (
414+ X .shape , dtype = dt , usm_type = usm_type , device = dev , order = "C"
393415 )
394- R = R [sl ]
395- return dpt .permute_dims (R , inv_perm )
416+ elif fl ["F" ]:
417+ return dpt .empty (
418+ X .shape , dtype = dt , usm_type = usm_type , device = dev , order = "F"
419+ )
420+ return _make_empty_like_orderK (X , dt , usm_type , dev )
396421
397422
398423def _empty_like_pair_orderK (X1 , X2 , dt , res_shape , usm_type , dev ):
0 commit comments