8000 Replace lists by numpy array in projection · matplotlib/matplotlib@a4a8a86 · GitHub
[go: up one dir, main page]

Skip to content

Commit a4a8a86

Browse files
Replace lists by numpy array in projection
1 parent 2303df6 commit a4a8a86

File tree

1 file changed

+21
-42
lines changed

1 file changed

+21
-42
lines changed

lib/mpl_toolkits/mplot3d/art3d.py

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -224,16 +224,10 @@ def do_3d_projection(self, renderer):
224224
'''
225225
Project the points according to renderer matrix.
226226
'''
227-
xyslist = [
228-
proj3d.proj_trans_points(points, renderer.M) for points in
229-
self._segments3d]
230-
segments_2d = [list(zip(xs, ys)) for (xs, ys, zs) in xyslist]
227+
xys = proj3d.proj_trans_points(self._segments3d, renderer.M)
228+
segments_2d = xys[0:1, :]
231229
LineCollection.set_segments(self, segments_2d)
232-
233-
# FIXME
234-
minz = 1e9
235-
for (xs, ys, zs) in xyslist:
236-
minz = min(minz, min(zs))
230+
minz = np.min(xys[2, :])
237231
return minz
238232

239233
def draw(self, renderer, project=False):
@@ -551,30 +545,15 @@ def set_zsort(self, zsort):
551545

552546
def get_vector(self, segments3d):
553547
"""Optimize points for projection"""
554-
si = 0
555-
ei = 0
556-
segis = []
557-
points = []
558-
for p in segments3d:
559-
points.extend(p)
560-
ei = si+len(p)
561-
segis.append((si, ei))
562-
si = ei
563-
564-
if len(segments3d) > 0 :
565-
xs, ys, zs = list(zip(*points))
566-
else :
567-
# We need this so that we can skip the bad unpacking from zip()
568-
xs, ys, zs = [], [], []
569-
570-
ones = np.ones(len(xs))
571-
self._vec = np.array([xs, ys, zs, ones])
572-
self._segis = segis
548+
xys = segments3d.reshape((-1, 3)).T
549+
ones = np.ones(xys.shape[1])
550+
self._vec = np.vstack([xys, ones])
573551

574552
def set_verts(self, verts, closed=True):
575553
'''Set 3D vertices.'''
576554
self.get_vector(verts)
577555
# 2D verts will be updated at draw time
556+
# XXX Is this line useful?
578557
PolyCollection.set_verts(self, [], closed)
579558

580559
def set_verts_and_codes(self, verts, codes):
@@ -601,6 +580,9 @@ def set_sort_zpos(self,val):
601580
self._sort_zpos = val
602581
self.stale = True
603582

583+
from profilehooks import profile
584+
585+
#@profile
604586
def do_3d_projection(self, renderer):
605587
'''
606588
Perform the 3D projection for this object.
@@ -610,9 +592,9 @@ def do_3d_projection(self, renderer):
610592
self.update_scalarmappable()
611593
self._facecolors3d = self._facecolors
612594

613-
txs, tys, tzs = proj3d.proj_transform_vec(self._vec, renderer.M)
614-
xyzlist = [(txs[si:ei], tys[si:ei], tzs[si:ei])
615-
for si, ei in self._segis]
595+
# XXX proj_transform_vec can work with arrays only
596+
xys = np.array(proj3d.proj_transform_vec(self._vec, renderer.M))
597+
xyzlist = np.transpose(xys.T.reshape((-1, 3, 3)), axes=[0, 2, 1])
616598

617599
# This extra fuss is to re-order face / edge colors
618600
cface = self._facecolors3d
@@ -626,24 +608,21 @@ def do_3d_projection(self, renderer):
626608

627609
# if required sort by depth (furthest drawn first)
628610
if self._zsort:
629-
indices = range(len(xyzlist))
630-
z_segments_2d = [(self._zsortfunc(zs), list(zip(xs, ys)), fc, ec,
631-
idx) for (xs, ys, zs), fc, ec, idx in
632-
zip(xyzlist, cface, cedge, indices)]
633-
z_segments_2d.sort(key=lambda x: x[0], reverse=True)
611+
z_argsort = np.argsort(
612+
self._zsortfunc(xyzlist[:, 2, :], axis=1))[::-1]
634613
else:
635614
raise ValueError("whoops")
636615

637-
segments_2d = [s for z, s, fc, ec, idx in z_segments_2d]
616+
segments_2d = np.transpose(xyzlist[z_argsort, 0:2, :], axes=[0, 2, 1])
638617
if self._codes3d is not None:
639-
codes = [self._codes3d[idx] for z, s, fc, ec, idx in z_segments_2d]
618+
codes = self._codes3d[z_argsort]
640619
PolyCollection.set_verts_and_codes(self, segments_2d, codes)
641620
else:
642621
PolyCollection.set_verts(self, segments_2d)
643622

644-
self._facecolors2d = [fc for z, s, fc, ec, idx in z_segments_2d]
623+
self._facecolors2d = cface[z_argsort]
645624
if len(self._edgecolors3d) == len(cface):
646-
self._edgecolors2d = [ec for z, s, fc, ec, idx in z_segments_2d]
625+
self._edgecolors2d = cedge[z_argsort]
647626
else:
648627
self._edgecolors2d = self._edgecolors3d
649628

@@ -652,11 +631,11 @@ def do_3d_projection(self, renderer):
652631
zvec = np.array([[0], [0], [self._sort_zpos], [1]])
653632
ztrans = proj3d.proj_transform_vec(zvec, renderer.M)
654633
return ztrans[2][0]
655-
elif tzs.size > 0 :
634+
elif xys[2].size > 0 :
656635
# FIXME: Some results still don't look quite right.
657636
# In particular, examine contourf3d_demo2.py
658637
# with az = -54 and elev = -45.
659-
return np.min(tzs)
638+
return np.min(xys[2])
660639
else :
661640
return np.nan
662641

0 commit comments

Comments
 (0)
0