1
1
import dash_vtk
2
2
import base64
3
+ import numpy as np
3
4
4
5
try :
5
6
# v9 and above
29
30
def b64_encode_numpy (obj ):
30
31
# Convert 1D numpy arrays with numeric types to memoryviews with
31
32
# datatype and shape metadata.
33
+ if len (obj ) == 0 :
34
+ return obj .tolist ()
35
+
32
36
dtype = obj .dtype
33
37
if (
34
38
dtype .kind in ["u" , "i" , "f" ]
@@ -40,8 +44,31 @@ def b64_encode_numpy(obj):
40
44
buffer = base64 .b64encode (memoryview (obj .ravel (order = "C" ))).decode ("utf-8" )
41
45
return {"bvals" : buffer , "dtype" : str (dtype ), "shape" : obj .shape }
42
46
else :
43
- # Convert all other numpy arrays to lists
44
- return obj .tolist ()
47
+ buffer = None
48
+ dtype_str = None
49
+ # Try to see if we can downsize the array
50
+ max_value = np .amax (obj )
51
+ min_value = np .amin (obj )
52
+ signed = min_value < 0
53
+ test_value = max (max_value , - min_value )
54
+ if test_value < np .iinfo (np .int16 ).max and signed :
55
+ dtype_str = 'int16'
56
+ buffer = base64 .b64encode (memoryview (obj .astype (np .int16 ).ravel (order = "C" ))).decode ("utf-8" )
57
+ elif test_value < np .iinfo (np .int32 ).max and signed :
58
+ dtype_str = 'int32'
59
+ buffer = base64 .b64encode (memoryview (obj .astype (np .int32 ).ravel (order = "C" ))).decode ("utf-8" )
60
+ elif test_value < np .iinfo (np .uint16 ).max and not signed :
61
+ dtype_str = 'uint16'
62
+ buffer = base64 .b64encode (memoryview (obj .astype (np .uint16 ).ravel (order = "C" ))).decode ("utf-8" )
63
+ elif test_value < np .iinfo (np .uint32 ).max and not signed :
64
+ dtype_str = 'uint32'
65
+ buffer = base64 .b64encode (memoryview (obj .astype (np .uint32 ).ravel (order = "C" ))).decode ("utf-8" )
66
+
67
+ if dtype :
68
+ return {"bvals" : buffer , "dtype" : dtype_str , "shape" : obj .shape }
69
+
70
+ # Convert all other numpy arrays to lists
71
+ return obj .tolist ()
45
72
46
73
47
74
def to_mesh_state (dataset , field_to_keep = None , point_arrays = None , cell_arrays = None ):
0 commit comments