8000 fix ndarray to string. · SciSharp/TensorFlow.NET@f5cbf89 · GitHub
[go: up one dir, main page]

Skip to content

Commit f5cbf89

Browse files
committed
fix ndarray to string.
1 parent 76abb2c commit f5cbf89

File tree

3 files changed

+126
-31
lines changed

3 files changed

+126
-31
lines changed

src/TensorFlowNET.Core/Data/MnistModelLoader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ private NDArray ExtractLabels(string file, bool one_hot = false, int num_classes
157157

158158
private NDArray DenseToOneHot(NDArray labels_dense, int num_classes)
159159
{
160-
var num_labels = labels_dense.dims[0];
161-
var index_offset = np.arange(num_labels) * num_classes;
160+
var num_labels = (int)labels_dense.dims[0];
161+
// var index_offset = np.arange(num_labels) * num_classes;
162162
var labels_one_hot = np.zeros((num_labels, num_classes));
163163
var labels = labels_dense.ToArray<byte>();
164164
for (int row = 0; row < num_labels; row++)

src/TensorFlowNET.Core/Numpy/NDArray.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,6 @@ public NDIterator<T> AsIterator<T>(bool autoreset = false) where T : unmanaged
4646
public byte[] ToByteArray() => BufferToArray();
4747
public static string[] AsStringArray(NDArray arr) => throw new NotImplementedException("");
4848

49-
public override string ToString()
50-
{
51-
return tensor_util.to_numpy_string(this);
52-
}
49+
public override string ToString() => tensor_util.to_numpy_string(this);
5350
}
5451
}

src/TensorFlowNET.Core/Tensors/tensor_util.cs

Lines changed: 123 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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 (< 93C6 /span>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

Comments
 (0)
0