using System; using System.Collections.Generic; using System.Text; using System.Linq; namespace Tensorflow.NumPy { public class NDArrayRender { public static string ToString(NDArray array, int maxLength = 10) { Shape shape = array.shape; if (shape.IsScalar) return Render(array); var s = new StringBuilder(); s.Append("array("); Build(s, array, maxLength); s.Append(")"); return s.ToString(); } static void Build(StringBuilder s, NDArray array, int maxLength) { var shape = array.shape; if (shape.Length == 1) { s.Append("["); s.Append(Render(array)); s.Append("]"); return; } var len = shape[0]; s.Append("["); if (len <= maxLength) { for (int i = 0; i < len; i++) { Build(s, array[i], maxLength); if (i < len - 1) { s.Append(", "); s.AppendLine(); } } } else { for (int i = 0; i < maxLength / 2; i++) { Build(s, array[i], maxLength); if (i < len - 1) { s.Append(", "); s.AppendLine(); } } s.Append(" ... "); s.AppendLine(); for (int i = (int)len - maxLength / 2; i < len; i++) { Build(s, array[i], maxLength); if (i < len - 1) { s.Append(", "); s.AppendLine(); } } } s.Append("]"); } static string Render(NDArray array) { if (array.buffer == IntPtr.Zero) return ""; var dtype = array.dtype; var shape = array.shape; if (dtype == TF_DataType.TF_STRING) { if (array.rank == 0) return "'" + string.Join(string.Empty, array.StringBytes()[0] .Take(256) .Select(x => x < 32 || x > 127 ? "\\x" + x.ToString("x") : Convert.ToChar(x).ToString())) + "'"; else return $"'{string.Join("', '", array.StringData().Take(25))}'"; } else if (dtype == TF_DataType.TF_VARIANT) { return ""; } else if (dtype == TF_DataType.TF_RESOURCE) { return ""; } else { return dtype switch { TF_DataType.TF_BOOL => Render(array.ToArray(), array.shape), TF_DataType.TF_INT8 => Render(array.ToArray(), array.shape), TF_DataType.TF_INT32 => Render(array.ToArray(), array.shape), TF_DataType.TF_INT64 => Render(array.ToArray(), array.shape), TF_DataType.TF_UINT64 => Render(array.ToArray(), array.shape), TF_DataType.TF_FLOAT => Render(array.ToArray(), array.shape), TF_DataType.TF_DOUBLE => Render(array.ToArray(), array.shape), _ => Render(array.ToArray(), array.shape) }; } } static string Render(T[] array, Shape shape) { if (array == null) return ""; if (array.Length == 0) return ""; if (shape.IsScalar) return array[0].ToString(); var display = ""; if (array.Length <= 10) display += string.Join(", ", array); else display += string.Join(", ", array.Take(5)) + ", ..., " + string.Join(", ", array.Skip(array.Length - 5)); return display; } } }