Browse Source

A lot of changes in NumPy

pull/135/head
Jure Šorn 2 years ago
parent
commit
62a40ad97e
2 changed files with 79 additions and 73 deletions
  1. 73
      README.md
  2. 79
      index.html

73
README.md

@ -2559,18 +2559,10 @@ Profiling
--------- ---------
### Stopwatch ### Stopwatch
```python ```python
from time import time
start_time = time() # Seconds since the Epoch.
...
duration = time() - start_time
```
#### High performance:
```python
from time import perf_counter from time import perf_counter
start_time = perf_counter() # Seconds since the restart.
start_time = perf_counter()
... ...
duration = perf_counter() - start_time
duration_in_seconds = perf_counter() - start_time
``` ```
### Timing a Snippet ### Timing a Snippet
@ -2614,8 +2606,9 @@ Line # Mem usage Increment Line Contents
### Call Graph ### Call Graph
#### Generates a PNG image of the call graph with highlighted bottlenecks: #### Generates a PNG image of the call graph with highlighted bottlenecks:
```python ```python
# $ pip3 install pycallgraph2; brew/apt install graphviz
# $ pip3 install pycallgraph2; apt/brew install graphviz
import pycallgraph2 as cg, datetime import pycallgraph2 as cg, datetime
filename = f'profile-{datetime.datetime.now():%Y%m%d%H%M%S}.png' filename = f'profile-{datetime.datetime.now():%Y%m%d%H%M%S}.png'
drawer = cg.output.GraphvizOutput(output_file=filename) drawer = cg.output.GraphvizOutput(output_file=filename)
with cg.PyCallGraph(drawer): with cg.PyCallGraph(drawer):
@ -2633,62 +2626,70 @@ import numpy as np
``` ```
```python ```python
<array> = np.array(<list/list_of_lists>)
<array> = np.arange(from_inclusive, to_exclusive, ±step_size)
<array> = np.ones(<shape>)
<array> = np.random.randint(from_inclusive, to_exclusive, <shape>)
<array> = np.array(<list/list_of_lists>) # Returns 1d/2d NumPy array.
<array> = np.zeros/ones(<shape>) # Also np.full(<shape>, <el>).
<array> = np.arange(from_inc, to_exc, ±step) # Also np.linspace(start, stop, num).
<array> = np.random.randint(from_inc, to_exc, <shape>) # Also np.random.random(<shape>).
``` ```
```python ```python
<array>.shape = <shape>
<view> = <array>.reshape(<shape>)
<view> = np.broadcast_to(<array>, <shape>)
<view> = <array>.reshape(<shape>) # Also `<array>.shape = <shape>`.
<array> = <array>.flatten() # Collapses array into one dimension.
<view> = <array>.squeeze() # Removes dimensions of length one.
``` ```
```python ```python
<array> = <array>.sum(axis)
indexes = <array>.argmin(axis)
<array> = <array>.sum/min/mean/var/std(axis) # Passed dimension gets aggregated.
<array> = <array>.argmin(axis) # Returns indexes of smallest elements.
<array> = np.apply_along_axis(<func>, axis, <array>) # Func can return a scalar or array.
``` ```
* **Shape is a tuple of dimension sizes.**
* **Axis is an index of the dimension that gets aggregated. Leftmost dimension has index 0.**
* **Shape is a tuple of dimension sizes. A 100x50 RGB image has shape (50, 100, 3).**
* **Axis is an index of the dimension that gets aggregated. Leftmost/outermost dimension has index 0. Summing a 100x50 RGB image along the axis 2 will return a greyscale image with shape (50, 100).**
* **Passing a tuple of axes will chain the operations like this: `'<array>.<method>(axis_1, keepdims=True).<method>(axis_2).squeeze()'`.**
### Indexing ### Indexing
```bash ```bash
<el> = <2d_array>[row_index, column_index]
<1d_view> = <2d_array>[row_index]
<1d_view> = <2d_array>[:, column_index]
<el> = <2d_array>[row_index, column_index] # <3d_a>[table_i, row_i, column_i]
<1d_view> = <2d_array>[row_index] # <3d_a>[table_i, row_i]
<1d_view> = <2d_array>[:, column_index] # <3d_a>[table_i, :, column_i]
``` ```
```bash ```bash
<1d_array> = <2d_array>[row_indexes, column_indexes]
<2d_array> = <2d_array>[row_indexes]
<2d_array> = <2d_array>[:, column_indexes]
<1d_array> = <2d_array>[row_indexes, column_indexes] # <3d_a>[table_is, row_is, column_is]
<2d_array> = <2d_array>[row_indexes] # <3d_a>[table_is, row_is]
<2d_array> = <2d_array>[:, column_indexes] # <3d_a>[table_is, :, column_is]
``` ```
```bash ```bash
<2d_bools> = <2d_array> ><== <el>
<1d_array> = <2d_array>[<2d_bools>]
<2d_bools> = <2d_array> ><== <el> # <3d_array> ><== <1d_array>
<1d_array> = <2d_array>[<2d_bools>] # <3d_array>[<2d_bools>]
``` ```
* **All examples also allow assignments.**
### Broadcasting ### Broadcasting
**Broadcasting is a set of rules by which NumPy functions operate on arrays of different sizes and/or dimensions.** **Broadcasting is a set of rules by which NumPy functions operate on arrays of different sizes and/or dimensions.**
```python ```python
left = [[0.1], [0.6], [0.8]] # Shape: (3, 1)
right = [ 0.1 , 0.6 , 0.8 ] # Shape: (3)
left = [[0.1], [0.6], [0.8]] # Shape: (3, 1)
right = [ 0.1 , 0.6 , 0.8 ] # Shape: (3,)
``` ```
#### 1. If array shapes differ in length, left-pad the shorter shape with ones: #### 1. If array shapes differ in length, left-pad the shorter shape with ones:
```python ```python
left = [[0.1], [0.6], [0.8]] # Shape: (3, 1)
right = [[0.1 , 0.6 , 0.8]] # Shape: (1, 3) <- !
left = [[0.1], [0.6], [0.8]] # Shape: (3, 1)
right = [[0.1 , 0.6 , 0.8]] # Shape: (1, 3) <- !
``` ```
#### 2. If any dimensions differ in size, expand the ones that have size 1 by duplicating their elements: #### 2. If any dimensions differ in size, expand the ones that have size 1 by duplicating their elements:
```python ```python
left = [[0.1, 0.1, 0.1], [0.6, 0.6, 0.6], [0.8, 0.8, 0.8]] # Shape: (3, 3) <- !
right = [[0.1, 0.6, 0.8], [0.1, 0.6, 0.8], [0.1, 0.6, 0.8]] # Shape: (3, 3) <- !
left = [[0.1, 0.1, 0.1], # Shape: (3, 3) <- !
[0.6, 0.6, 0.6],
[0.8, 0.8, 0.8]]
right = [[0.1, 0.6, 0.8], # Shape: (3, 3) <- !
[0.1, 0.6, 0.8],
[0.1, 0.6, 0.8]]
``` ```
#### 3. If neither non-matching dimension has size 1, raise an error. #### 3. If neither non-matching dimension has size 1, raise an error.

79
index.html

@ -54,7 +54,7 @@
<body> <body>
<header> <header>
<aside>July 18, 2022</aside>
<aside>July 20, 2022</aside>
<a href="https://gto76.github.io" rel="author">Jure Šorn</a> <a href="https://gto76.github.io" rel="author">Jure Šorn</a>
</header> </header>
@ -2096,19 +2096,13 @@ run(host=<span class="hljs-string">'0.0.0.0'</span>, port=<span class="hljs-numb
{<span class="hljs-string">'team'</span>: <span class="hljs-string">'arsenal f.c.'</span>, <span class="hljs-string">'odds'</span>: [<span class="hljs-number">2.09</span>, <span class="hljs-number">3.74</span>, <span class="hljs-number">3.68</span>]} {<span class="hljs-string">'team'</span>: <span class="hljs-string">'arsenal f.c.'</span>, <span class="hljs-string">'odds'</span>: [<span class="hljs-number">2.09</span>, <span class="hljs-number">3.74</span>, <span class="hljs-number">3.68</span>]}
</code></pre></div> </code></pre></div>
<div><h2 id="profiling"><a href="#profiling" name="profiling">#</a>Profiling</h2><div><h3 id="stopwatch">Stopwatch</h3><pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> time <span class="hljs-keyword">import</span> time
start_time = time() <span class="hljs-comment"># Seconds since the Epoch.</span>
<div><h2 id="profiling"><a href="#profiling" name="profiling">#</a>Profiling</h2><div><h3 id="stopwatch">Stopwatch</h3><pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> time <span class="hljs-keyword">import</span> perf_counter
start_time = perf_counter()
... ...
duration = time() - start_time
duration_in_seconds = perf_counter() - start_time
</code></pre></div></div> </code></pre></div></div>
<div><h4 id="highperformance">High performance:</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> time <span class="hljs-keyword">import</span> perf_counter
start_time = perf_counter() <span class="hljs-comment"># Seconds since the restart.</span>
...
duration = perf_counter() - start_time
</code></pre></div>
<div><h3 id="timingasnippet">Timing a Snippet</h3><pre><code class="python language-python hljs"><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> timeit <span class="hljs-keyword">import</span> timeit <div><h3 id="timingasnippet">Timing a Snippet</h3><pre><code class="python language-python hljs"><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> timeit <span class="hljs-keyword">import</span> timeit
<span class="hljs-meta">&gt;&gt;&gt; </span>timeit(<span class="hljs-string">"''.join(str(i) for i in range(100))"</span>, <span class="hljs-meta">&gt;&gt;&gt; </span>timeit(<span class="hljs-string">"''.join(str(i) for i in range(100))"</span>,
<span class="hljs-meta">... </span> number=<span class="hljs-number">10000</span>, globals=globals(), setup=<span class="hljs-string">'pass'</span>) <span class="hljs-meta">... </span> number=<span class="hljs-number">10000</span>, globals=globals(), setup=<span class="hljs-string">'pass'</span>)
@ -2139,8 +2133,9 @@ Line # Mem usage Increment Line Contents
3 38.012 MiB 0.344 MiB a = [*range(10000)] 3 38.012 MiB 0.344 MiB a = [*range(10000)]
4 38.477 MiB 0.465 MiB b = {*range(10000)} 4 38.477 MiB 0.465 MiB b = {*range(10000)}
</code></pre> </code></pre>
<div><h3 id="callgraph">Call Graph</h3><div><h4 id="generatesapngimageofthecallgraphwithhighlightedbottlenecks">Generates a PNG image of the call graph with highlighted bottlenecks:</h4><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install pycallgraph2; brew/apt install graphviz</span>
<div><h3 id="callgraph">Call Graph</h3><div><h4 id="generatesapngimageofthecallgraphwithhighlightedbottlenecks">Generates a PNG image of the call graph with highlighted bottlenecks:</h4><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install pycallgraph2; apt/brew install graphviz</span>
<span class="hljs-keyword">import</span> pycallgraph2 <span class="hljs-keyword">as</span> cg, datetime <span class="hljs-keyword">import</span> pycallgraph2 <span class="hljs-keyword">as</span> cg, datetime
filename = <span class="hljs-string">f'profile-<span class="hljs-subst">{datetime.datetime.now():%Y%m%d%H%M%S}</span>.png'</span> filename = <span class="hljs-string">f'profile-<span class="hljs-subst">{datetime.datetime.now():%Y%m%d%H%M%S}</span>.png'</span>
drawer = cg.output.GraphvizOutput(output_file=filename) drawer = cg.output.GraphvizOutput(output_file=filename)
<span class="hljs-keyword">with</span> cg.PyCallGraph(drawer): <span class="hljs-keyword">with</span> cg.PyCallGraph(drawer):
@ -2153,45 +2148,55 @@ drawer = cg.output.GraphvizOutput(output_file=filename)
</code></pre></div> </code></pre></div>
<pre><code class="python language-python hljs">&lt;array&gt; = np.array(&lt;list/list_of_lists&gt;)
&lt;array&gt; = np.arange(from_inclusive, to_exclusive, ±step_size)
&lt;array&gt; = np.ones(&lt;shape&gt;)
&lt;array&gt; = np.random.randint(from_inclusive, to_exclusive, &lt;shape&gt;)
<pre><code class="python language-python hljs">&lt;array&gt; = np.array(&lt;list/list_of_lists&gt;) <span class="hljs-comment"># Returns 1d/2d NumPy array.</span>
&lt;array&gt; = np.zeros/ones(&lt;shape&gt;) <span class="hljs-comment"># Also np.full(&lt;shape&gt;, &lt;el&gt;).</span>
&lt;array&gt; = np.arange(from_inc, to_exc, ±step) <span class="hljs-comment"># Also np.linspace(start, stop, num).</span>
&lt;array&gt; = np.random.randint(from_inc, to_exc, &lt;shape&gt;) <span class="hljs-comment"># Also np.random.random(&lt;shape&gt;).</span>
</code></pre> </code></pre>
<pre><code class="python language-python hljs">&lt;array&gt;.shape = &lt;shape&gt;
&lt;view&gt; = &lt;array&gt;.reshape(&lt;shape&gt;)
&lt;view&gt; = np.broadcast_to(&lt;array&gt;, &lt;shape&gt;)
<pre><code class="python language-python hljs">&lt;view&gt; = &lt;array&gt;.reshape(&lt;shape&gt;) <span class="hljs-comment"># Also `&lt;array&gt;.shape = &lt;shape&gt;`.</span>
&lt;array&gt; = &lt;array&gt;.flatten() <span class="hljs-comment"># Collapses array into one dimension.</span>
&lt;view&gt; = &lt;array&gt;.squeeze() <span class="hljs-comment"># Removes dimensions of length one.</span>
</code></pre> </code></pre>
<pre><code class="python language-python hljs">&lt;array&gt; = &lt;array&gt;.sum(axis)
indexes = &lt;array&gt;.argmin(axis)
<pre><code class="python language-python hljs">&lt;array&gt; = &lt;array&gt;.sum/min/mean/var/std(axis) <span class="hljs-comment"># Passed dimension gets aggregated.</span>
&lt;array&gt; = &lt;array&gt;.argmin(axis) <span class="hljs-comment"># Returns indexes of smallest elements.</span>
&lt;array&gt; = np.apply_along_axis(&lt;func&gt;, axis, &lt;array&gt;) <span class="hljs-comment"># Func can return a scalar or array.</span>
</code></pre> </code></pre>
<ul> <ul>
<li><strong>Shape is a tuple of dimension sizes.</strong></li>
<li><strong>Axis is an index of the dimension that gets aggregated. Leftmost dimension has index 0.</strong></li>
<li><strong>Shape is a tuple of dimension sizes. A 100x50 RGB image has shape (50, 100, 3).</strong></li>
<li><strong>Axis is an index of the dimension that gets aggregated. Leftmost/outermost dimension has index 0. Summing a 100x50 RGB image along the axis 2 will return a greyscale image with shape (50, 100).</strong></li>
<li><strong>Passing a tuple of axes will chain the operations like this: <code class="python hljs"><span class="hljs-string">'&lt;array&gt;.&lt;method&gt;(axis_1, keepdims=True).&lt;method&gt;(axis_2).squeeze()'</span></code>.</strong></li>
</ul> </ul>
<div><h3 id="indexing">Indexing</h3><pre><code class="bash language-bash hljs">&lt;el&gt; = &lt;2d_array&gt;[row_index, column_index]
&lt;1d_view&gt; = &lt;2d_array&gt;[row_index]
&lt;1d_view&gt; = &lt;2d_array&gt;[:, column_index]
<div><h3 id="indexing">Indexing</h3><pre><code class="bash language-bash hljs">&lt;el&gt; = &lt;2d_array&gt;[row_index, column_index] <span class="hljs-comment"># &lt;3d_a&gt;[table_i, row_i, column_i]</span>
&lt;1d_view&gt; = &lt;2d_array&gt;[row_index] <span class="hljs-comment"># &lt;3d_a&gt;[table_i, row_i]</span>
&lt;1d_view&gt; = &lt;2d_array&gt;[:, column_index] <span class="hljs-comment"># &lt;3d_a&gt;[table_i, :, column_i]</span>
</code></pre></div> </code></pre></div>
<pre><code class="bash language-bash hljs">&lt;1d_array&gt; = &lt;2d_array&gt;[row_indexes, column_indexes]
&lt;2d_array&gt; = &lt;2d_array&gt;[row_indexes]
&lt;2d_array&gt; = &lt;2d_array&gt;[:, column_indexes]
<pre><code class="bash language-bash hljs">&lt;1d_array&gt; = &lt;2d_array&gt;[row_indexes, column_indexes] <span class="hljs-comment"># &lt;3d_a&gt;[table_is, row_is, column_is]</span>
&lt;2d_array&gt; = &lt;2d_array&gt;[row_indexes] <span class="hljs-comment"># &lt;3d_a&gt;[table_is, row_is]</span>
&lt;2d_array&gt; = &lt;2d_array&gt;[:, column_indexes] <span class="hljs-comment"># &lt;3d_a&gt;[table_is, :, column_is]</span>
</code></pre> </code></pre>
<pre><code class="bash language-bash hljs">&lt;2d_bools&gt; = &lt;2d_array&gt; &gt;&lt;== &lt;el&gt;
&lt;1d_array&gt; = &lt;2d_array&gt;[&lt;2d_bools&gt;]
<pre><code class="bash language-bash hljs">&lt;2d_bools&gt; = &lt;2d_array&gt; &gt;&lt;== &lt;el&gt; <span class="hljs-comment"># &lt;3d_array&gt; &gt;&lt;== &lt;1d_array&gt;</span>
&lt;1d_array&gt; = &lt;2d_array&gt;[&lt;2d_bools&gt;] <span class="hljs-comment"># &lt;3d_array&gt;[&lt;2d_bools&gt;]</span>
</code></pre> </code></pre>
<div><h3 id="broadcasting">Broadcasting</h3><p><strong>Broadcasting is a set of rules by which NumPy functions operate on arrays of different sizes and/or dimensions.</strong></p><pre><code class="python language-python hljs">left = [[<span class="hljs-number">0.1</span>], [<span class="hljs-number">0.6</span>], [<span class="hljs-number">0.8</span>]] <span class="hljs-comment"># Shape: (3, 1)</span>
right = [ <span class="hljs-number">0.1</span> , <span class="hljs-number">0.6</span> , <span class="hljs-number">0.8</span> ] <span class="hljs-comment"># Shape: (3)</span>
<ul>
<li><strong>All examples also allow assignments.</strong></li>
</ul>
<div><h3 id="broadcasting">Broadcasting</h3><p><strong>Broadcasting is a set of rules by which NumPy functions operate on arrays of different sizes and/or dimensions.</strong></p><pre><code class="python language-python hljs">left = [[<span class="hljs-number">0.1</span>], [<span class="hljs-number">0.6</span>], [<span class="hljs-number">0.8</span>]] <span class="hljs-comment"># Shape: (3, 1)</span>
right = [ <span class="hljs-number">0.1</span> , <span class="hljs-number">0.6</span> , <span class="hljs-number">0.8</span> ] <span class="hljs-comment"># Shape: (3,)</span>
</code></pre></div> </code></pre></div>
<div><h4 id="1ifarrayshapesdifferinlengthleftpadtheshortershapewithones">1. If array shapes differ in length, left-pad the shorter shape with ones:</h4><pre><code class="python language-python hljs">left = [[<span class="hljs-number">0.1</span>], [<span class="hljs-number">0.6</span>], [<span class="hljs-number">0.8</span>]] <span class="hljs-comment"># Shape: (3, 1)</span>
right = [[<span class="hljs-number">0.1</span> , <span class="hljs-number">0.6</span> , <span class="hljs-number">0.8</span>]] <span class="hljs-comment"># Shape: (1, 3) &lt;- !</span>
<div><h4 id="1ifarrayshapesdifferinlengthleftpadtheshortershapewithones">1. If array shapes differ in length, left-pad the shorter shape with ones:</h4><pre><code class="python language-python hljs">left = [[<span class="hljs-number">0.1</span>], [<span class="hljs-number">0.6</span>], [<span class="hljs-number">0.8</span>]] <span class="hljs-comment"># Shape: (3, 1)</span>
right = [[<span class="hljs-number">0.1</span> , <span class="hljs-number">0.6</span> , <span class="hljs-number">0.8</span>]] <span class="hljs-comment"># Shape: (1, 3) &lt;- !</span>
</code></pre></div> </code></pre></div>
<div><h4 id="2ifanydimensionsdifferinsizeexpandtheonesthathavesize1byduplicatingtheirelements">2. If any dimensions differ in size, expand the ones that have size 1 by duplicating their elements:</h4><pre><code class="python language-python hljs">left = [[<span class="hljs-number">0.1</span>, <span class="hljs-number">0.1</span>, <span class="hljs-number">0.1</span>], [<span class="hljs-number">0.6</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.6</span>], [<span class="hljs-number">0.8</span>, <span class="hljs-number">0.8</span>, <span class="hljs-number">0.8</span>]] <span class="hljs-comment"># Shape: (3, 3) &lt;- !</span>
right = [[<span class="hljs-number">0.1</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.8</span>], [<span class="hljs-number">0.1</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.8</span>], [<span class="hljs-number">0.1</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.8</span>]] <span class="hljs-comment"># Shape: (3, 3) &lt;- !</span>
<div><h4 id="2ifanydimensionsdifferinsizeexpandtheonesthathavesize1byduplicatingtheirelements">2. If any dimensions differ in size, expand the ones that have size 1 by duplicating their elements:</h4><pre><code class="python language-python hljs">left = [[<span class="hljs-number">0.1</span>, <span class="hljs-number">0.1</span>, <span class="hljs-number">0.1</span>], <span class="hljs-comment"># Shape: (3, 3) &lt;- !</span>
[<span class="hljs-number">0.6</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.6</span>],
[<span class="hljs-number">0.8</span>, <span class="hljs-number">0.8</span>, <span class="hljs-number">0.8</span>]]
right = [[<span class="hljs-number">0.1</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.8</span>], <span class="hljs-comment"># Shape: (3, 3) &lt;- !</span>
[<span class="hljs-number">0.1</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.8</span>],
[<span class="hljs-number">0.1</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.8</span>]]
</code></pre></div> </code></pre></div>
<div><h4 id="3ifneithernonmatchingdimensionhassize1raiseanerror">3. If neither non-matching dimension has size 1, raise an error.</h4><div><h3 id="example-1">Example</h3><div><h4 id="foreachpointreturnsindexofitsnearestpoint010608121">For each point returns index of its nearest point (<code class="python hljs">[<span class="hljs-number">0.1</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.8</span>] =&gt; [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>]</code>):</h4><pre><code class="python language-python hljs"><span class="hljs-meta">&gt;&gt;&gt; </span>points = np.array([<span class="hljs-number">0.1</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.8</span>]) <div><h4 id="3ifneithernonmatchingdimensionhassize1raiseanerror">3. If neither non-matching dimension has size 1, raise an error.</h4><div><h3 id="example-1">Example</h3><div><h4 id="foreachpointreturnsindexofitsnearestpoint010608121">For each point returns index of its nearest point (<code class="python hljs">[<span class="hljs-number">0.1</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.8</span>] =&gt; [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>]</code>):</h4><pre><code class="python language-python hljs"><span class="hljs-meta">&gt;&gt;&gt; </span>points = np.array([<span class="hljs-number">0.1</span>, <span class="hljs-number">0.6</span>, <span class="hljs-number">0.8</span>])
@ -2900,7 +2905,7 @@ $ pyinstaller script.py --add-data '&lt;path&gt;:.' <span class="hljs-comment">
<footer> <footer>
<aside>July 18, 2022</aside>
<aside>July 20, 2022</aside>
<a href="https://gto76.github.io" rel="author">Jure Šorn</a> <a href="https://gto76.github.io" rel="author">Jure Šorn</a>
</footer> </footer>

Loading…
Cancel
Save