You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

NDArrayRender.cs 4.3 kB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Linq;
  5. namespace Tensorflow.NumPy
  6. {
  7. public class NDArrayRender
  8. {
  9. public static string ToString(NDArray array, int maxLength = 10)
  10. {
  11. Shape shape = array.shape;
  12. if (shape.IsScalar)
  13. return Render(array);
  14. var s = new StringBuilder();
  15. s.Append("array(");
  16. Build(s, array, maxLength);
  17. s.Append(")");
  18. return s.ToString();
  19. }
  20. static void Build(StringBuilder s, NDArray array, int maxLength)
  21. {
  22. var shape = array.shape;
  23. if (shape.Length == 1)
  24. {
  25. s.Append("[");
  26. s.Append(Render(array));
  27. s.Append("]");
  28. return;
  29. }
  30. var len = shape[0];
  31. s.Append("[");
  32. if (len <= maxLength)
  33. {
  34. for (int i = 0; i < len; i++)
  35. {
  36. Build(s, array[i], maxLength);
  37. if (i < len - 1)
  38. {
  39. s.Append(", ");
  40. s.AppendLine();
  41. }
  42. }
  43. }
  44. else
  45. {
  46. for (int i = 0; i < maxLength / 2; i++)
  47. {
  48. Build(s, array[i], maxLength);
  49. if (i < len - 1)
  50. {
  51. s.Append(", ");
  52. s.AppendLine();
  53. }
  54. }
  55. s.Append(" ... ");
  56. s.AppendLine();
  57. for (int i = (int)len - maxLength / 2; i < len; i++)
  58. {
  59. Build(s, array[i], maxLength);
  60. if (i < len - 1)
  61. {
  62. s.Append(", ");
  63. s.AppendLine();
  64. }
  65. }
  66. }
  67. s.Append("]");
  68. }
  69. static string Render(NDArray array)
  70. {
  71. if (array.buffer == IntPtr.Zero)
  72. return "<null>";
  73. var dtype = array.dtype;
  74. var shape = array.shape;
  75. if (dtype == TF_DataType.TF_STRING)
  76. {
  77. if (array.rank == 0)
  78. return "'" + string.Join(string.Empty, array.StringBytes()[0]
  79. .Take(256)
  80. .Select(x => x < 32 || x > 127 ? "\\x" + x.ToString("x") : Convert.ToChar(x).ToString())) + "'";
  81. else
  82. return $"'{string.Join("', '", array.StringData().Take(25))}'";
  83. }
  84. else if (dtype == TF_DataType.TF_VARIANT)
  85. {
  86. return "<unprintable>";
  87. }
  88. else if (dtype == TF_DataType.TF_RESOURCE)
  89. {
  90. return "<unprintable>";
  91. }
  92. else
  93. {
  94. return dtype switch
  95. {
  96. TF_DataType.TF_BOOL => Render(array.ToArray<bool>(), array.shape),
  97. TF_DataType.TF_INT8 => Render(array.ToArray<sbyte>(), array.shape),
  98. TF_DataType.TF_INT32 => Render(array.ToArray<int>(), array.shape),
  99. TF_DataType.TF_INT64 => Render(array.ToArray<long>(), array.shape),
  100. TF_DataType.TF_UINT64 => Render(array.ToArray<ulong>(), array.shape),
  101. TF_DataType.TF_FLOAT => Render(array.ToArray<float>(), array.shape),
  102. TF_DataType.TF_DOUBLE => Render(array.ToArray<double>(), array.shape),
  103. _ => Render(array.ToArray<byte>(), array.shape)
  104. };
  105. }
  106. }
  107. static string Render<T>(T[] array, Shape shape)
  108. {
  109. if (array == null)
  110. return "<null>";
  111. if (array.Length == 0)
  112. return "<empty>";
  113. if (shape.IsScalar)
  114. return array[0].ToString();
  115. var display = "";
  116. if (array.Length <= 10)
  117. display += string.Join(", ", array);
  118. else
  119. display += string.Join(", ", array.Take(5)) + ", ..., " + string.Join(", ", array.Skip(array.Length - 5));
  120. return display;
  121. }
  122. }
  123. }