@@ -361,11 +361,20 @@ def to_rgba_array(c, alpha=None):
361
361
362
362
if len (c ) == 0 :
363
363
return np .zeros ((0 , 4 ), float )
364
+
365
+ # Quick path if the whole sequence can be directly converted to a numpy
366
+ # array in one shot.
367
+ lens = {len (cc ) if isinstance (cc , (list , tuple )) else - 1 for cc in c }
368
+ if lens == {3 }:
369
+ rgba = np .column_stack ([c , np .ones (len (c ))])
370
+ elif lens == {4 }:
371
+ rgba = np .array (c )
364
372
else :
365
- if np .iterable (alpha ):
366
- return np .array ([to_rgba (cc , aa ) for cc , aa in zip (c , alpha )])
367
- else :
368
- return np .array ([to_rgba (cc , alpha ) for cc in c ])
373
+ rgba = np .array ([to_rgba (cc ) for cc in c ])
374
+
375
+ if alpha is not None :
376
+ rgba [:, 3 ] = alpha
377
+ return rgba
369
378
370
379
371
380
def to_rgb (c ):
@@ -914,13 +923,13 @@ def from_list(name, colors, N=256, gamma=1.0):
914
923
else :
915
924
vals = np .linspace (0 , 1 , len (colors ))
916
925
917
- cdict = dict ( red = [], green = [], blue = [], alpha = [])
918
- for val , color in zip ( vals , colors ):
919
- r , g , b , a = to_rgba ( color )
920
- cdict [ 'red' ]. append (( val , r , r ))
921
- cdict [ 'green' ]. append (( val , g , g ))
922
- cdict [ 'blue' ]. append (( val , b , b ))
923
- cdict [ 'alpha' ]. append (( val , a , a ))
926
+ r , g , b , a = to_rgba_array ( colors ). T
927
+ cdict = {
928
+ "red" : np . column_stack ([ vals , r , r ]),
929
+ "green" : np . column_stack ([ vals , g , g ]),
930
+ "blue" : np . column_stack ([ vals , b , b ]),
931
+ "alpha" : np . column_stack ([ vals , a , a ]),
932
+ }
924
933
925
934
return LinearSegmentedColormap (name , cdict , N , gamma )
926
935
0 commit comments