@@ -470,7 +470,7 @@ public static Tensor shape_tensor(int[] shape)
470470 return ops . convert_to_tensor ( shape , dtype : TF_DataType . TF_INT32 , name : "shape" ) ;
471471 }
472472
473- public static string to_numpy_string ( Tensor array )
473+ public static string to_numpy_string ( NDArray array )
474474 {
475475 Shape shape = array . shape ;
476476 if ( shape . ndim == 0 )
@@ -483,10 +483,66 @@ public static string to_numpy_string(Tensor array)
483483 return s . ToString ( ) ;
484484 }
485485
486- static string Render ( Tensor tensor )
486+ static void PrettyPrint ( StringBuilder s , NDArray array )
487+ {
488+ var shape = array . shape ;
489+
490+ if ( shape . Length == 1 )
491+ {
492+ s . Append ( "[" ) ;
493+ s . Append ( Render ( array ) ) ;
494+ s . Append ( "]" ) ;
495+ return ;
496+ }
497+
498+ var len = shape [ 0 ] ;
499+ s . Append ( "[" ) ;
500+
501+ if ( len <= 10 )
502+ {
503+ for ( int i = 0 ; i < len ; i ++ )
504+ {
505+ PrettyPrint ( s , array [ i ] ) ;
506+ if ( i < len - 1 )
507+ {
508+ s . Append ( ", " ) ;
509+ s . AppendLine ( ) ;
510+ }
511+ }
512+ }
513+ else
514+ {
515+ for ( int i = 0 ; i < 5 ; i ++ )
516+ {
517+ PrettyPrint ( s , array [ i ] ) ;
518+ if ( i < len - 1 )
519+ {
520+ s . Append ( ", " ) ;
521+ s . AppendLine ( ) ;
522+ }
523+ }
524+
525+ s . Append ( " ... " ) ;
526+ s . AppendLine ( ) ;
527+
528+ for ( int i = ( int ) len - 5 ; i < len ; i ++ )
529+ {
530+ PrettyPrint ( s , array [ i ] ) ;
531+ if ( i < len - 1 )
532+ {
533+ s . Append ( ", " ) ;
534+ s . AppendLine ( ) ;
535+ }
536+ }
537+ }
538+
539+ s . Append ( "]" ) ;
540+ }
541+
542+ static string Render ( NDArray tensor )
487543 {
488544 if ( tensor . buffer == IntPtr . Zero )
489- return "Empty " ;
545+ return "<null> " ;
490546
491547 var dtype = tensor . dtype ;
492548 var shape = tensor . shape ;
@@ -508,48 +564,90 @@ static string Render(Tensor tensor)
508564 {
509565 return "<unprintable>" ;
510566 }
511- else if ( dtype == TF_DataType . TF_BOOL )
512- {
513- var array = tensor . ToArray < bool > ( ) ;
514- return DisplayArrayAsString ( array , tensor . shape ) ;
515- }
516- else if ( dtype == TF_DataType . TF_INT32 )
567+ else
517568 {
518- var array = tensor . ToArray < int > ( ) ;
519- return DisplayArrayAsString ( array , tensor . shape ) ;
569+ return dtype switch
570+ {
571+ TF_DataType . TF_BOOL => DisplayArrayAsString ( tensor . ToArray < bool > ( ) , tensor . shape ) ,
572+ TF_DataType . TF_INT8 => DisplayArrayAsString ( tensor . ToArray < sbyte > ( ) , tensor . shape ) ,
573+ TF_DataType . TF_INT32 => DisplayArrayAsString ( tensor . ToArray < int > ( ) , tensor . shape ) ,
574+ TF_DataType . TF_INT64 => DisplayArrayAsString ( tensor . ToArray < long > ( ) , tensor . shape ) ,
575+ TF_DataType . TF_FLOAT => DisplayArrayAsString ( tensor . ToArray < float > ( ) , tensor . shape ) ,
576+ TF_DataType . TF_DOUBLE => DisplayArrayAsString ( tensor . ToArray < double > ( ) , tensor . shape ) ,
577+ _ => DisplayArrayAsString ( tensor . ToArray < byte > ( ) , tensor . shape )
578+ } ;
520579 }
521- else if ( dtype == TF_DataType . TF_INT64 )
580+ }
581+
582+ public static string to_numpy_string ( Tensor array )
583+ {
584+ Shape shape = array . shape ;
585+ if ( shape . ndim == 0 )
586+ return array [ 0 ] . ToString ( ) ;
587+
588+ var s = new StringBuilder ( ) ;
589+ s . Append ( "array(" ) ;
590+ PrettyPrint ( s , array ) ;
591+ s . Append ( ")" ) ;
592+ return s . ToString ( ) ;
593+ }
594+
595+ static string Render ( Tensor tensor )
596+ {
597+ if ( tensor . buffer == IntPtr . Zero )
598+ return "<null>" ;
599+
600+ var dtype = tensor . dtype ;
601+ var shape = tensor . shape ;
602+
603+ if ( dtype == TF_DataType . TF_STRING )
522604 {
523- var array = tensor . ToArray < long > ( ) ;
524- return DisplayArrayAsString ( array , tensor . shape ) ;
605+ if ( tensor . rank == 0 )
606+ return "'" + string . Join ( string . Empty , tensor . StringBytes ( ) [ 0 ]
607+ . Take ( 25 )
608+ . Select ( x => x < 32 || x > 127 ? "\\ x" + x . ToString ( "x" ) : Convert . ToChar ( x ) . ToString ( ) ) ) + "'" ;
609+ else
610+ return $ "['{ string . Join ( "', '" , tensor . StringData ( ) . Take ( 25 ) ) } ']";
525611 }
526- else if ( dtype == TF_DataType . TF_FLOAT )
612+ else if ( dtype == TF_DataType . TF_VARIANT )
527613 {
528- var array = tensor . ToArray < float > ( ) ;
529- return DisplayArrayAsString ( array , tensor . shape ) ;
614+ return "<unprintable>" ;
530615 }
531- else if ( dtype == TF_DataType . TF_DOUBLE )
616+ else if ( dtype == TF_DataType . TF_RESOURCE )
532617 {
533- var array = tensor . ToArray < double > ( ) ;
534- return DisplayArrayAsString ( array , tensor . shape ) ;
618+ return "<unprintable>" ;
535619 }
536620 else
537621 {
538- var array = tensor . ToArray < byte > ( ) ;
539- return DisplayArrayAsString ( array , tensor . shape ) ;
622+ return dtype switch
623+ {
624+ TF_DataType . TF_BOOL => DisplayArrayAsString ( tensor . ToArray < bool > ( ) , tensor . shape ) ,
625+ TF_DataType . TF_INT8 => DisplayArrayAsString ( tensor . ToArray < sbyte > ( ) , tensor . shape ) ,
626+ TF_DataType . TF_INT32 => DisplayArrayAsString ( tensor . ToArray < int > ( ) , tensor . shape ) ,
627+ TF_DataType . TF_INT64 => DisplayArrayAsString ( tensor . ToArray < long > ( ) , tensor . shape ) ,
628+ TF_DataType . TF_FLOAT => DisplayArrayAsString ( tensor . ToArray < float > ( ) , tensor . shape ) ,
629+ TF_DataType . TF_DOUBLE => DisplayArrayAsString ( tensor . ToArray < double > ( ) , tensor . shape ) ,
630+ _ => DisplayArrayAsString ( tensor . ToArray < byte > ( ) , tensor . shape )
631+ } ;
540632 }
541633 }
542634
543635 static string DisplayArrayAsString < T > ( T [ ] array , Shape shape )
544636 {
637+ if ( array == null )
638+ return "<null>" ;
639+
640+ if ( array . Length == 0 )
641+ return "<empty>" ;
642+
545643 if ( shape . ndim == 0 )
546644 return array [ 0 ] . ToString ( ) ;
547645
548646 var display = "" ;
549- if ( array . Length < 10 )
647+ if ( array . Length <= 10 )
550648 display += string . Join ( ", " , array ) ;
551649 else
552- display += string . Join ( ", " , array . Take ( 3 ) ) + ", ..., " + string . Join ( ", " , array . Skip ( array . Length - 3 ) ) ;
650+ display += string . Join ( ", " , array . Take ( 5 ) ) + ", ..., " + string . Join ( ", " , array . Skip ( array . Length - 5 ) ) ;
553651 return display ;
554652 }
555653
@@ -597,7 +695,7 @@ static void PrettyPrint(StringBuilder s, Tensor array, bool flat = false)
597695 s . Append ( " ... " ) ;
598696 s . AppendLine ( ) ;
599697
600- for ( int i = ( int ) array . size - 5 ; i < len ; i ++ )
698+ for ( int i = ( int ) len - 5 ; i < len ; i ++ )
601699 {
602700 PrettyPrint ( s , array [ i ] , flat ) ;
603701 if ( i < len - 1 )
0 commit comments