@@ -57,7 +57,7 @@ public NDArray this[NDArray mask]
5757 }
5858 }
5959
60-
60+ [ AutoNumPy ]
6161 unsafe NDArray GetData ( Slice [ ] slices )
6262 {
6363 if ( shape . IsScalar )
@@ -170,9 +170,9 @@ unsafe NDArray GetData(int[] indices, int axis = 0)
170170 }
171171
172172 void SetData ( IEnumerable < Slice > slices , NDArray array )
173- => SetData ( array , data , slices . ToArray ( ) , new int [ shape . ndim ] . ToArray ( ) , - 1 ) ;
173+ => SetData ( array , slices . ToArray ( ) , new int [ shape . ndim ] . ToArray ( ) , - 1 ) ;
174174
175- unsafe void SetData ( NDArray src , IntPtr dst , Slice [ ] slices , int [ ] indices , int currentNDim )
175+ unsafe void SetData ( NDArray src , Slice [ ] slices , int [ ] indices , int currentNDim )
176176 {
177177 if ( dtype != src . dtype )
178178 src = src . astype ( dtype ) ;
@@ -181,20 +181,23 @@ unsafe void SetData(NDArray src, IntPtr dst, Slice[] slices, int[] indices, int
181181 if ( ! slices . Any ( ) )
182182 return ;
183183
184+ if ( shape . Equals ( src . shape ) )
185+ {
186+ System . Buffer . MemoryCopy ( src . data . ToPointer ( ) , data . ToPointer ( ) , src . bytesize , src . bytesize ) ;
187+ return ;
188+ }
189+
184190 // first iteration
185191 if ( currentNDim == - 1 )
186192 {
187193 slices = SliceHelper . AlignWithShape ( shape , slices ) ;
188- if ( ! shape . Equals ( src . shape ) )
189- {
190- var newShape = ShapeHelper . AlignWithShape ( shape , src . shape ) ;
191- src = src . reshape ( newShape ) ;
192- }
193194 }
194195
195196 // last dimension
196197 if ( currentNDim == ndim - 1 )
197198 {
199+ var offset = ( int ) ShapeHelper . GetOffset ( shape , indices ) ;
200+ var dst = data + offset * ( int ) dtypesize ;
198201 System . Buffer . MemoryCopy ( src . data . ToPointer ( ) , dst . ToPointer ( ) , src . bytesize , src . bytesize ) ;
199202 return ;
200203 }
@@ -206,13 +209,56 @@ unsafe void SetData(NDArray src, IntPtr dst, Slice[] slices, int[] indices, int
206209 var stop = slice . Stop ?? ( int ) dims [ currentNDim ] ;
207210 var step = slice . Step ;
208211
209- for ( var i = start ; i < stop ; i += step )
212+ if ( step != 1 )
210213 {
211- indices [ currentNDim ] = i ;
212- var offset = ( int ) ShapeHelper . GetOffset ( shape , indices ) ;
213- dst = data + offset * ( int ) dtypesize ;
214- var srcIndex = ( i - start ) / step ;
215- SetData ( src [ srcIndex ] , dst , slices , indices , currentNDim ) ;
214+ for ( var i = start ; i < stop ; i += step )
215+ {
216+ if ( i >= dims [ currentNDim ] )
217+ throw new OutOfRangeError ( $ "Index should be in [0, { dims [ currentNDim ] } ] but got { i } ") ;
218+
219+ indices [ currentNDim ] = i ;
220+ if ( currentNDim < ndim - src . ndim )
221+ {
222+ SetData ( src , slices , indices , currentNDim ) ;
223+ }
224+ else
225+ {
226+ var srcIndex = ( i - start ) / step ;
227+ SetData ( src [ srcIndex ] , slices , indices , currentNDim ) ;
228+ }
229+ }
230+ }
231+ else
232+ {
233+ for ( var i = start ; i < stop ; i ++ )
234+ {
235+ if ( i >= dims [ currentNDim ] )
236+ throw new OutOfRangeError ( $ "Index should be in [0, { dims [ currentNDim ] } ] but got { i } ") ;
237+
238+ indices [ currentNDim ] = i ;
239+ if ( currentNDim < ndim - src . ndim )
240+ {
241+ SetData ( src , slices , indices , currentNDim ) ;
242+ }
243+ // last dimension
244+ else if ( currentNDim == ndim - 1 )
245+ {
246+ SetData ( src , slices , indices , currentNDim ) ;
247+ break ;
248+ }
249+ else if ( SliceHelper . IsContinuousBlock ( slices , currentNDim ) )
250+ {
251+ var offset = ( int ) ShapeHelper . GetOffset ( shape , indices ) ;
252+ var dst = data + offset * ( int ) dtypesize ;
253+ System . Buffer . MemoryCopy ( src . data . ToPointer ( ) , dst . ToPointer ( ) , src . bytesize , src . bytesize ) ;
254+ return ;
255+ }
256+ else
257+ {
258+ var srcIndex = i - start ;
259+ SetData ( src [ srcIndex ] , slices , indices , currentNDim ) ;
260+ }
261+ }
216262 }
217263
218264 // reset indices
0 commit comments