@@ -116,7 +116,9 @@ def _copy_from_numpy_into(dst, np_ary):
116116 )
117117
118118
119- def from_numpy (np_ary , / , * , device = None , usm_type = "device" , sycl_queue = None ):
119+ def from_numpy (
120+ np_ary , / , * , device = None , usm_type = "device" , sycl_queue = None , order = "K"
121+ ):
120122 """
121123 from_numpy(arg, device=None, usm_type="device", sycl_queue=None)
122124
@@ -349,6 +351,31 @@ def _copy_from_usm_ndarray_to_usm_ndarray(dst, src):
349351 _copy_same_shape (dst , src_same_shape )
350352
351353
354+ def _make_empty_like_orderK (X , dt , usm_type , dev ):
355+ st = list (X .strides )
356+ perm = sorted (
357+ range (X .ndim ),
358+ key = lambda d : builtins .abs (st [d ]) if X .shape [d ] > 1 else 0 ,
359+ reverse = True ,
360+ )
361+ inv_perm = sorted (range (X .ndim ), key = lambda i : perm [i ])
362+ sh = X .shape
363+ sh_sorted = tuple (sh [i ] for i in perm )
364+ R = dpt .empty (sh_sorted , dtype = dt , usm_type = usm_type , device = dev , order = "C" )
365+ if min (st ) < 0 :
366+ st_sorted = [st [i ] for i in perm ]
367+ sl = tuple (
368+ (
369+ slice (None , None , - 1 )
370+ if st_sorted [i ] < 0
371+ else slice (None , None , None )
372+ )
373+ for i in range (X .ndim )
374+ )
375+ R = R [sl ]
376+ return dpt .permute_dims (R , inv_perm )
377+
378+
352379def _empty_like_orderK (X , dt , usm_type = None , dev = None ):
353380 """Returns empty array like `x`, using order='K'
354381
@@ -371,28 +398,28 @@ def _empty_like_orderK(X, dt, usm_type=None, dev=None):
371398 return dpt .empty_like (
372399 X , dtype = dt , usm_type = usm_type , device = dev , order = "F"
373400 )
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 )
401+ return _make_empty_like_orderK (X , dt , usm_type , dev )
402+
403+
404+ def _from_numpy_empty_like_orderK (X , dt , usm_type , dev ):
405+ """Returns empty usm_ndarray like NumPy array `x`, using order='K'
406+
407+ For an array `x` that was obtained by permutation of a contiguous
408+ array the returned array will have the same shape and the same
409+ strides as `x`.
410+ """
411+ if not isinstance (X , np .ndarray ):
412+ raise TypeError (f"Expected np.ndarray, got { type (X )} " )
413+ fl = X .flags
414+ if fl ["C" ] or X .size <= 1 :
415+ return dpt .usm_ndarray (
416+ X .shape , dtype = dt , usm_type = usm_type , device = dev , order = "C"
393417 )
394- R = R [sl ]
395- return dpt .permute_dims (R , inv_perm )
418+ elif fl ["F" ]:
419+ return dpt .usm_ndarray (
420+ X .shape , dtype = dt , usm_type = usm_type , device = dev , order = "F"
421+ )
422+ return _make_empty_like_orderK (X , dt , usm_type , dev )
396423
397424
398425def _empty_like_pair_orderK (X1 , X2 , dt , res_shape , usm_type , dev ):
0 commit comments