@@ -170,62 +170,53 @@ unsafe NDArray GetData(int[] indices, int axis = 0)
170170 }
171171
172172 void SetData ( IEnumerable < Slice > slices , NDArray array )
173- => SetData ( slices , array , - 1 , slices . Select ( x => 0 ) . ToArray ( ) ) ;
173+ => SetData ( array , data , slices . ToArray ( ) , new int [ shape . ndim ] . ToArray ( ) , - 1 ) ;
174174
175- void SetData ( IEnumerable < Slice > slices , NDArray array , int currentNDim , int [ ] indices )
175+ unsafe void SetData ( NDArray src , IntPtr dst , Slice [ ] slices , int [ ] indices , int currentNDim )
176176 {
177- if ( dtype != array . dtype )
178- array = array . astype ( dtype ) ;
177+ if ( dtype != src . dtype )
178+ src = src . astype ( dtype ) ;
179179 // throw new ArrayTypeMismatchException($"Required dtype {dtype} but {array.dtype} is assigned.");
180180
181181 if ( ! slices . Any ( ) )
182182 return ;
183183
184- var newshape = ShapeHelper . GetShape ( shape , slices . ToArray ( ) ) ;
185- if ( newshape . Equals ( array . shape ) )
184+ // first iteration
185+ if ( currentNDim == - 1 )
186186 {
187- var offset = ShapeHelper . GetOffset ( shape , slices . First ( ) . Start ?? 0 ) ;
188- unsafe
187+ slices = SliceHelper . AlignWithShape ( shape , slices ) ;
188+ if ( ! shape . Equals ( src . shape ) )
189189 {
190- var dst = ( byte * ) data + ( ulong ) offset * dtypesize ;
191- System . Buffer . MemoryCopy ( array . data . ToPointer ( ) , dst , array . bytesize , array . bytesize ) ;
190+ var newShape = ShapeHelper . AlignWithShape ( shape , src . shape ) ;
191+ src = src . reshape ( newShape ) ;
192192 }
193- return ;
194193 }
195194
196-
197- var slice = slices . First ( ) ;
198-
199- if ( slices . Count ( ) == 1 )
195+ // last dimension
196+ if ( currentNDim == ndim - 1 )
200197 {
201-
202- if ( slice . Step != 1 )
203- throw new NotImplementedException ( "slice.step should == 1" ) ;
204-
205- if ( slice . Start < 0 )
206- throw new NotImplementedException ( "slice.start should > -1" ) ;
207-
208- indices [ indices . Length - 1 ] = slice . Start ?? 0 ;
209- var offset = ( ulong ) ShapeHelper . GetOffset ( shape , indices ) ;
210- var bytesize = array . bytesize ;
211- unsafe
212- {
213- var dst = ( byte * ) data + offset * dtypesize ;
214- System . Buffer . MemoryCopy ( array . data . ToPointer ( ) , dst , bytesize , bytesize ) ;
215- }
216-
198+ System . Buffer . MemoryCopy ( src . data . ToPointer ( ) , dst . ToPointer ( ) , src . bytesize , src . bytesize ) ;
217199 return ;
218200 }
219201
220202 currentNDim ++ ;
221- if ( slice . Stop == null )
222- slice . Stop = ( int ) dims [ currentNDim ] ;
203+ var slice = slices [ currentNDim ] ;
204+
205+ var start = slice . Start ?? 0 ;
206+ var stop = slice . Stop ?? ( int ) dims [ currentNDim ] ;
207+ var step = slice . Step ;
223208
224- for ( var i = slice . Start ?? 0 ; i < slice . Stop ; i ++ )
209+ for ( var i = start ; i < stop ; i += step )
225210 {
226211 indices [ currentNDim ] = i ;
227- SetData ( slices . Skip ( 1 ) , array , currentNDim , indices ) ;
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 ) ;
228216 }
217+
218+ // reset indices
219+ indices [ currentNDim ] = 0 ;
229220 }
230221 }
231222}
0 commit comments