← numpy-100

Added Artisan #3 (solved) and #4 (unsolved)

5c5f62c582f47ebbf593a95c4e0a652d45ba5013 · Nicolas Rougier · Jul 20, 2014 11:48

+50 · 2 files changed

  • README.html +23 −0
  • README.rst +27 −0
diff --git a/README.html b/README.html
index 0d6dd88..caa7292 100644
--- a/README.html
+++ b/README.html
@@ -469,6 +469,29 @@ np.bincount(A) == C ?</p>
 <span class="keyword">print</span> <span class="name">np</span><span class="operator">.</span><span class="name">unpackbits</span><span class="punctuation">(</span><span class="name">I</span><span class="punctuation">[:,</span> <span class="name">np</span><span class="operator">.</span><span class="name">newaxis</span><span class="punctuation">],</span> <span class="name">axis</span><span class="operator">=</span><span class="literal number integer">1</span><span class="punctuation">)</span>
 </pre>
 </li>
+<li><p class="first">Consider 2 sets of points P0,P1 describing lines (2d) and a point p, how to
+compute distance from p to each line i (P0[i],P1[i]) ?</p>
+<pre class="code python literal-block">
+<span class="keyword">def</span> <span class="name function">distance</span><span class="punctuation">(</span><span class="name">P0</span><span class="punctuation">,</span> <span class="name">P1</span><span class="punctuation">,</span> <span class="name">p</span><span class="punctuation">):</span>
+  <span class="name">T</span> <span class="operator">=</span> <span class="name">P1</span> <span class="operator">-</span> <span class="name">P0</span>
+  <span class="name">L</span> <span class="operator">=</span> <span class="punctuation">(</span><span class="name">T</span><span class="operator">**</span><span class="literal number integer">2</span><span class="punctuation">)</span><span class="operator">.</span><span class="name">sum</span><span class="punctuation">(</span><span class="name">axis</span><span class="operator">=</span><span class="literal number integer">1</span><span class="punctuation">)</span>
+  <span class="name">U</span> <span class="operator">=</span> <span class="operator">-</span><span class="punctuation">((</span><span class="name">P0</span><span class="punctuation">[:,</span><span class="literal number integer">0</span><span class="punctuation">]</span><span class="operator">-</span><span class="name">p</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">])</span><span class="operator">*</span><span class="name">T</span><span class="punctuation">[:,</span><span class="literal number integer">0</span><span class="punctuation">]</span> <span class="operator">+</span> <span class="punctuation">(</span><span class="name">P0</span><span class="punctuation">[:,</span><span class="literal number integer">1</span><span class="punctuation">]</span><span class="operator">-</span><span class="name">p</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">])</span><span class="operator">*</span><span class="name">T</span><span class="punctuation">[:,</span><span class="literal number integer">1</span><span class="punctuation">])</span> <span class="operator">/</span> <span class="name">L</span>
+  <span class="name">U</span> <span class="operator">=</span> <span class="name">U</span><span class="operator">.</span><span class="name">reshape</span><span class="punctuation">(</span><span class="name builtin">len</span><span class="punctuation">(</span><span class="name">U</span><span class="punctuation">),</span><span class="literal number integer">1</span><span class="punctuation">)</span>
+  <span class="name">D</span> <span class="operator">=</span> <span class="name">P0</span> <span class="operator">+</span> <span class="name">U</span><span class="operator">*</span><span class="name">T</span> <span class="operator">-</span> <span class="name">p</span>
+  <span class="keyword">return</span> <span class="name">np</span><span class="operator">.</span><span class="name">sqrt</span><span class="punctuation">((</span><span class="name">D</span><span class="operator">**</span><span class="literal number integer">2</span><span class="punctuation">)</span><span class="operator">.</span><span class="name">sum</span><span class="punctuation">(</span><span class="name">axis</span><span class="operator">=</span><span class="literal number integer">1</span><span class="punctuation">))</span>
+
+<span class="name">P0</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">random</span><span class="operator">.</span><span class="name">uniform</span><span class="punctuation">(</span><span class="operator">-</span><span class="literal number integer">10</span><span class="punctuation">,</span><span class="literal number integer">10</span><span class="punctuation">,(</span><span class="literal number integer">100</span><span class="punctuation">,</span><span class="literal number integer">2</span><span class="punctuation">))</span>
+<span class="name">P1</span> <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">random</span><span class="operator">.</span><span class="name">uniform</span><span class="punctuation">(</span><span class="operator">-</span><span class="literal number integer">10</span><span class="punctuation">,</span><span class="literal number integer">10</span><span class="punctuation">,(</span><span class="literal number integer">100</span><span class="punctuation">,</span><span class="literal number integer">2</span><span class="punctuation">))</span>
+<span class="name">p</span>  <span class="operator">=</span> <span class="name">np</span><span class="operator">.</span><span class="name">random</span><span class="operator">.</span><span class="name">uniform</span><span class="punctuation">(</span><span class="operator">-</span><span class="literal number integer">10</span><span class="punctuation">,</span><span class="literal number integer">10</span><span class="punctuation">,(</span>  <span class="literal number integer">1</span><span class="punctuation">,</span><span class="literal number integer">2</span><span class="punctuation">))</span>
+<span class="keyword">print</span> <span class="name">distance</span><span class="punctuation">(</span><span class="name">P0</span><span class="punctuation">,</span> <span class="name">P1</span><span class="punctuation">,</span> <span class="name">p</span><span class="punctuation">)</span>
+</pre>
+</li>
+<li><p class="first">Consider 2 sets of points P0,P1 describing lines (2d) and a set of point P,
+how to compute distance from each point j (P[j]) to each line i (P0[i],P1[i]) ?</p>
+<pre class="code python literal-block">
+<span class="name">Answer</span> <span class="name">needed</span> <span class="name">actually</span>
+</pre>
+</li>
 </ol>
 </div>
 <div class="section" id="adept">
diff --git a/README.rst b/README.rst
index 2cf4ad3..a4bfb55 100644
--- a/README.rst
+++ b/README.rst
@@ -560,6 +560,33 @@ Artisan
       print np.unpackbits(I[:, np.newaxis], axis=1)
 
 
+3. Consider 2 sets of points P0,P1 describing lines (2d) and a point p, how to
+   compute distance from p to each line i (P0[i],P1[i]) ?
+
+   .. code-block:: python
+
+      def distance(P0, P1, p):
+        T = P1 - P0
+        L = (T**2).sum(axis=1)
+        U = -((P0[:,0]-p[0])*T[:,0] + (P0[:,1]-p[1])*T[:,1]) / L
+        U = U.reshape(len(U),1)
+        D = P0 + U*T - p
+        return np.sqrt((D**2).sum(axis=1))
+
+      P0 = np.random.uniform(-10,10,(100,2))
+      P1 = np.random.uniform(-10,10,(100,2))
+      p  = np.random.uniform(-10,10,(  1,2))
+      print distance(P0, P1, p)
+
+
+4. Consider 2 sets of points P0,P1 describing lines (2d) and a set of point P,
+   how to compute distance from each point j (P[j]) to each line i (P0[i],P1[i]) ?
+
+   .. code-block:: python
+
+      Answer needed actually
+
+
 
 Adept
 =====