class_docstr: Fast 'geometric' approximation, recommended for large arrays.
class_docstr_tok: ["Fast","'geometric","'","approximation",",","recommended","for","large","arrays","."]
docstr: self.df is computed as weighted average of _triangles sharing a common
  node. On each triangle itri f is first assumed linear (= ~f), which
  allows to compute d~f[itri]
  Then the following approximation of df nodal values is then proposed:
      f[ipt] = SUM ( w[itri] x d~f[itri] , for itri sharing apex ipt)
  The weighted coeff. w[itri] are proportional to the angle of the
  triangle itri at apex ipt
docstr_tok: ["self.df","is","computed","as","weighted","average","of","_triangles","sharing","a","common","node",".","On","each","triangle","itri","f","is","first","assumed","linear","(","=","~f",")",",","which","allows","to","compute","d~f","[","itri","]","Then","the","following","approximation","of","df","nodal","values","is","then","proposed",":","f","[","ipt","]","=","SUM","(","w","[","itri","]","x","d~f","[","itri","]",",","for","itri","sharing","apex","ipt",")","The","weighted","coeff",".","w","[","itri","]","are","proportional","to","the","angle","of","the","triangle","itri","at","apex","ipt"]
code: def compute_dz(self):
      """
      self.df is computed as weighted average of _triangles sharing a common
      node. On each triangle itri f is first assumed linear (= ~f), which
      allows to compute d~f[itri]
      Then the following approximation of df nodal values is then proposed:
          f[ipt] = SUM ( w[itri] x d~f[itri] , for itri sharing apex ipt)
      The weighted coeff. w[itri] are proportional to the angle of the
      triangle itri at apex ipt
      """
      el_geom_w = self.compute_geom_weights()
      el_geom_grad = self.compute_geom_grads()
  
      # Sum of weights coeffs
      w_node_sum = np.bincount(
          np.ravel(self._triangles), weights=np.ravel(el_geom_w)
      )
  
      # Sum of weighted df = (dfx, dfy)
      dfx_el_w = np.empty_like(el_geom_w)
      dfy_el_w = np.empty_like(el_geom_w)
      for iapex in range(3):
          dfx_el_w[:, iapex] = el_geom_w[:, iapex] * el_geom_grad[:, 0]
          dfy_el_w[:, iapex] = el_geom_w[:, iapex] * el_geom_grad[:, 1]
      dfx_node_sum = np.bincount(
          np.ravel(self._triangles), weights=np.ravel(dfx_el_w)
      )
      dfy_node_sum = np.bincount(
          np.ravel(self._triangles), weights=np.ravel(dfy_el_w)
      )
  
      # Estimation of df
      dfx_estim = dfx_node_sum / w_node_sum
      dfy_estim = dfy_node_sum / w_node_sum
      return np.vstack([dfx_estim, dfy_estim]).T
  
imports: import numpy
  from matplotlib import _api
  from matplotlib.tri import Triangulation
  from matplotlib.tri._trifinder import TriFinder
  from matplotlib.tri._tritools import TriAnalyzer
label_desc: Use image node_id 1 for calling the _DOF_estimator_geom obj's underlying member method code with example usage: obj.compute_dz() and returns: np