We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
1 parent 5424ba0 commit c6a7f75Copy full SHA for c6a7f75
6 files changed
dpnp/backend/include/dpnp_iface_fptr.hpp
@@ -107,6 +107,7 @@ enum class DPNPFuncName : size_t
107
DPNP_FN_FABS, /**< Used in numpy.fabs() implementation */
108
DPNP_FN_FFT_FFT, /**< Used in numpy.fft.fft() implementation */
109
DPNP_FN_FILL_DIAGONAL, /**< Used in numpy.fill_diagonal() implementation */
110
+ DPNP_FN_FLATTEN, /**< Used in numpy.flatten() implementation */
111
DPNP_FN_FLOOR, /**< Used in numpy.floor() implementation */
112
DPNP_FN_FLOOR_DIVIDE, /**< Used in numpy.floor_divide() implementation */
113
DPNP_FN_FMOD, /**< Used in numpy.fmod() implementation */
dpnp/backend/kernels/dpnp_krnl_elemwise.cpp
@@ -309,6 +309,13 @@ static void func_map_init_elemwise_1arg_1type(func_map_t& fmap)
309
fmap[DPNPFuncName::DPNP_FN_ERF][eft_FLT][eft_FLT] = {eft_FLT, (void*)dpnp_erf_c<float>};
310
fmap[DPNPFuncName::DPNP_FN_ERF][eft_DBL][eft_DBL] = {eft_DBL, (void*)dpnp_erf_c<double>};
311
312
+ fmap[DPNPFuncName::DPNP_FN_FLATTEN][eft_BLN][eft_BLN] = {eft_BLN, (void*)dpnp_copy_c<bool>};
313
+ fmap[DPNPFuncName::DPNP_FN_FLATTEN][eft_INT][eft_INT] = {eft_INT, (void*)dpnp_copy_c<int>};
314
+ fmap[DPNPFuncName::DPNP_FN_FLATTEN][eft_LNG][eft_LNG] = {eft_LNG, (void*)dpnp_copy_c<long>};
315
+ fmap[DPNPFuncName::DPNP_FN_FLATTEN][eft_FLT][eft_FLT] = {eft_FLT, (void*)dpnp_copy_c<float>};
316
+ fmap[DPNPFuncName::DPNP_FN_FLATTEN][eft_DBL][eft_DBL] = {eft_DBL, (void*)dpnp_copy_c<double>};
317
+ fmap[DPNPFuncName::DPNP_FN_FLATTEN][eft_C128][eft_C128] = {eft_C128, (void*)dpnp_copy_c<std::complex<double>>};
318
+
319
fmap[DPNPFuncName::DPNP_FN_RECIP][eft_INT][eft_INT] = {eft_INT, (void*)dpnp_recip_c<int>};
320
fmap[DPNPFuncName::DPNP_FN_RECIP][eft_LNG][eft_LNG] = {eft_LNG, (void*)dpnp_recip_c<long>};
321
fmap[DPNPFuncName::DPNP_FN_RECIP][eft_FLT][eft_FLT] = {eft_FLT, (void*)dpnp_recip_c<float>};
dpnp/dparray.pyx
@@ -512,11 +512,7 @@ cdef class dparray:
512
if order == 'F':
513
return self.transpose().reshape(self.size)
514
515
- result = dparray(self.size, dtype=self.dtype)
516
- for i in range(result.size):
517
- result[i] = self[i]
518
-
519
- return result
+ return dpnp_flatten(self)
520
521
result = utils.dp2nd_array(self).flatten(order=order)
522
dpnp/dpnp_algo/dpnp_algo.pxd
@@ -80,6 +80,7 @@ cdef extern from "dpnp_iface_fptr.hpp" namespace "DPNPFuncName": # need this na
80
DPNP_FN_FABS
81
DPNP_FN_FFT_FFT
82
DPNP_FN_FILL_DIAGONAL
83
+ DPNP_FN_FLATTEN
84
DPNP_FN_FLOOR
85
DPNP_FN_FLOOR_DIVIDE
86
DPNP_FN_FMOD
@@ -229,6 +230,7 @@ cdef dparray call_fptr_2in_1out(DPNPFuncName fptr_name, object x1_obj, object x2
229
230
231
232
cpdef dparray dpnp_astype(dparray array1, dtype_target)
233
+cpdef dparray dpnp_flatten(dparray array1)
234
235
236
"""
dpnp/dpnp_algo/dpnp_algo.pyx
@@ -45,6 +45,7 @@ __all__ = [
45
"dpnp_arange",
46
"dpnp_array",
47
"dpnp_astype",
48
+ "dpnp_flatten",
49
"dpnp_init_val",
50
"dpnp_matmul",
51
"dpnp_queue_initialize",
@@ -70,6 +71,7 @@ include "dpnp_algo_trigonometric.pyx"
70
71
72
ctypedef void(*fptr_dpnp_arange_t)(size_t, size_t, void *, size_t)
73
ctypedef void(*fptr_dpnp_astype_t)(const void *, void * , const size_t)
74
+ctypedef void(*fptr_dpnp_flatten_t)(const void *, void * , const size_t)
75
ctypedef void(*fptr_dpnp_initval_t)(void *, void * , size_t)
76
77
@@ -140,6 +142,20 @@ cpdef dparray dpnp_astype(dparray array1, dtype_target):
140
142
return result
141
143
144
145
+cpdef dparray dpnp_flatten(dparray array_):
146
+ cdef DPNPFuncType param1_type = dpnp_dtype_to_DPNPFuncType(array_.dtype)
147
148
+ cdef DPNPFuncData kernel_data = get_dpnp_function_ptr(DPNP_FN_FLATTEN, param1_type, param1_type)
149
150
+ result_type = dpnp_DPNPFuncType_to_dtype(< size_t > kernel_data.return_type)
151
+ cdef dparray result = dparray(array_.size, dtype=result_type)
152
153
+ cdef fptr_dpnp_flatten_t func = <fptr_dpnp_flatten_t > kernel_data.ptr
154
+ func(array_.get_data(), result.get_data(), array_.size)
155
156
+ return result
157
158
159
cpdef dparray dpnp_init_val(shape, dtype, value):
160
cdef DPNPFuncType param1_type = dpnp_dtype_to_DPNPFuncType(dtype)
161
tests/test_dparray.py
@@ -18,3 +18,17 @@ def test_astype(arr, arr_dtype, res_dtype):
18
expected = numpy_array.astype(res_dtype)
19
result = dpnp_array.astype(res_dtype)
20
numpy.testing.assert_array_equal(expected, result)
21
22
23
+@pytest.mark.parametrize("arr_dtype",
24
+ [numpy.float64, numpy.float32, numpy.int64, numpy.int32, numpy.bool, numpy.bool_, numpy.complex],
25
+ ids=['float64', 'float32', 'int64', 'int32', 'bool', 'bool_', 'complex'])
26
+@pytest.mark.parametrize("arr",
27
+ [[-2, -1, 0, 1, 2], [[-2, -1], [1, 2]], []],
28
+ ids=['[-2, -1, 0, 1, 2]', '[[-2, -1], [1, 2]]', '[]'])
29
+def test_flatten(arr, arr_dtype):
30
+ numpy_array = numpy.array(arr, dtype=arr_dtype)
31
+ dpnp_array = dpnp.array(arr, dtype=arr_dtype)
32
+ expected = numpy_array.flatten()
33
+ result = dpnp_array.flatten()
34
+ numpy.testing.assert_array_equal(expected, result)
0 commit comments