@@ -57,7 +57,7 @@ public NDArray this[NDArray mask]
57
57
}
58
58
}
59
59
60
-
60
+ [ AutoNumPy ]
61
61
unsafe NDArray GetData ( Slice [ ] slices )
62
62
{
63
63
if ( shape . IsScalar )
@@ -170,9 +170,9 @@ unsafe NDArray GetData(int[] indices, int axis = 0)
170
170
}
171
171
172
172
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 ) ;
174
174
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 )
176
176
{
177
177
if ( dtype != src . dtype )
178
178
src = src . astype ( dtype ) ;
@@ -181,20 +181,23 @@ unsafe void SetData(NDArray src, IntPtr dst, Slice[] slices, int[] indices, int
181
181
if ( ! slices . Any ( ) )
182
182
return ;
183
183
184
+ if ( shape . Equals ( src . shape ) )
185
+ {
186
+ System . Buffer . MemoryCopy ( src . data . ToPointer ( ) , data . ToPointer ( ) , src . bytesize , src . bytesize ) ;
187
+ return ;
188
+ }
189
+
184
190
// first iteration
185
191
if ( currentNDim == - 1 )
186
192
{
187
193
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
- }
193
194
}
194
195
195
196
// last dimension
196
197
if ( currentNDim == ndim - 1 )
197
198
{
199
+ var offset = ( int ) ShapeHelper . GetOffset ( shape , indices ) ;
200
+ var dst = data + offset * ( int ) dtypesize ;
198
201
System . Buffer . MemoryCopy ( src . data . ToPointer ( ) , dst . ToPointer ( ) , src . bytesize , src . bytesize ) ;
199
202
return ;
200
203
}
@@ -206,13 +209,56 @@ unsafe void SetData(NDArray src, IntPtr dst, Slice[] slices, int[] indices, int
206
209
var stop = slice . Stop ?? ( int ) dims [ currentNDim ] ;
207
210
var step = slice . Step ;
208
211
209
- for ( var i = start ; i < stop ; i += step )
212
+ if ( step != 1 )
210
213
{
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
+ }
216
262
}
217
263
218
264
// reset indices
0 commit comments