@@ -116,7 +116,9 @@ def _copy_from_numpy_into(dst, np_ary):
116
116
)
117
117
118
118
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
+ ):
120
122
"""
121
123
from_numpy(arg, device=None, usm_type="device", sycl_queue=None)
122
124
@@ -349,6 +351,31 @@ def _copy_from_usm_ndarray_to_usm_ndarray(dst, src):
349
351
_copy_same_shape (dst , src_same_shape )
350
352
351
353
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
+
352
379
def _empty_like_orderK (X , dt , usm_type = None , dev = None ):
353
380
"""Returns empty array like `x`, using order='K'
354
381
@@ -371,28 +398,28 @@ def _empty_like_orderK(X, dt, usm_type=None, dev=None):
371
398
return dpt .empty_like (
372
399
X , dtype = dt , usm_type = usm_type , device = dev , order = "F"
373
400
)
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"
393
417
)
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 )
396
423
397
424
398
425
def _empty_like_pair_orderK (X1 , X2 , dt , res_shape , usm_type , dev ):
0 commit comments