@@ -15,7 +15,7 @@ public NDArray this[params int[] indices]
1515 Start = x ,
1616 Stop = x + 1 ,
1717 IsIndex = true
18- } ) ) ;
18+ } ) . ToArray ( ) ) ;
1919
2020 set => SetData ( indices . Select ( x =>
2121 {
@@ -55,21 +55,58 @@ public NDArray this[NDArray mask]
5555 }
5656 }
5757
58- NDArray GetData ( IEnumerable < Slice > slices )
58+
59+ unsafe NDArray GetData ( Slice [ ] slices )
5960 {
6061 if ( shape . IsScalar )
6162 return GetScalar ( ) ;
6263
64+ if ( SliceHelper . AreAllIndex ( slices , out var indices1 ) )
65+ {
66+ var newshape = ShapeHelper . GetShape ( shape , slices ) ;
67+ if ( newshape . IsScalar )
68+ {
69+ var offset = ShapeHelper . GetOffset ( shape , indices1 ) ;
70+ return GetScalar ( ( ulong ) offset ) ;
71+ }
72+ else
73+ {
74+ return GetArrayData ( newshape , indices1 ) ;
75+ }
76+ }
77+ else if ( slices . Count ( ) == 1 )
78+ {
79+ var slice = slices [ 0 ] ;
80+ if ( slice . Step == 1 )
81+ {
82+ var newshape = ShapeHelper . GetShape ( shape , slice ) ;
83+ var array = new NDArray ( newshape , dtype : dtype ) ;
84+
85+ var new_dims = new int [ shape . ndim ] ;
86+ new_dims [ 0 ] = slice . Start ?? 0 ;
87+ //for (int i = 1; i < shape.ndim; i++)
88+ //new_dims[i] = (int)shape.dims[i];
89+
90+ var offset = ShapeHelper . GetOffset ( shape , new_dims ) ;
91+ var src = ( byte * ) data + ( ulong ) offset * dtypesize ;
92+ var dst = ( byte * ) array . data ;
93+ var len = ( ulong ) newshape . size * dtypesize ;
94+
95+ System . Buffer . MemoryCopy ( src , dst , len , len ) ;
96+
97+ return array ;
98+ }
99+ }
100+
101+ // default, performance is bad
63102 var tensor = base [ slices . ToArray ( ) ] ;
64103 if ( tensor . Handle == null )
65104 {
66105 if ( tf . executing_eagerly ( ) )
67106 tensor = tf . defaultSession . eval ( tensor ) ;
68- else
69- return new NDArray ( tensor ) ;
70107 }
71-
72- return new NDArray ( tensor ) ;
108+
109+ return new NDArray ( tensor , tf . executing_eagerly ( ) ) ;
73110 }
74111
75112 unsafe T GetAtIndex < T > ( params int [ ] indices ) where T : unmanaged
@@ -78,17 +115,26 @@ unsafe T GetAtIndex<T>(params int[] indices) where T : unmanaged
78115 return * ( ( T * ) data + offset ) ;
79116 }
80117
81- NDArray GetScalar ( )
118+ unsafe NDArray GetScalar ( ulong offset = 0 )
82119 {
83120 var array = new NDArray ( Shape . Scalar , dtype : dtype ) ;
84- unsafe
85- {
86- var src = ( byte * ) data + dtypesize ;
87- System . Buffer . MemoryCopy ( src , array . buffer . ToPointer ( ) , bytesize , bytesize ) ;
88- }
121+ var src = ( byte * ) data + offset * dtypesize ;
122+ System . Buffer . MemoryCopy ( src , array . buffer . ToPointer ( ) , dtypesize , dtypesize ) ;
89123 return array ;
90124 }
91125
126+ unsafe NDArray GetArrayData ( Shape newshape , int [ ] indices )
127+ {
128+ var offset = ShapeHelper . GetOffset ( shape , indices ) ;
129+ var len = ( ulong ) newshape . size * dtypesize ;
130+ var array = new NDArray ( newshape , dtype : dtype ) ;
131+
132+ var src = ( byte * ) data + ( ulong ) offset * dtypesize ;
133+ System . Buffer . MemoryCopy ( src , array . data . ToPointer ( ) , len , len ) ;
134+
135+ return array ;
136+ }
137+
92138 NDArray GetData ( int [ ] indices , int axis = 0 )
93139 {
94140 if ( shape . IsScalar )
0 commit comments