Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 43f9d741 authored by hhakim's avatar hhakim
Browse files

Remove warning about buggy Faust indexing for Windows pyfaust (as 8fb4df1 6658f9a5 fixed it).

parent c96b108e
No related branches found
No related tags found
No related merge requests found
Pipeline #833872 skipped
......@@ -11832,11 +11832,11 @@ It's use is straighforward as you can see in the <a href="https://faustgrp.gitla
<div class="output_subarea output_stream output_stdout output_text">
<pre>Faust size 10x10, density 2.5, nnz_sum 250, 5 factor(s):
- FACTOR 0 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 1 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 2 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 3 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 4 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 0 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 1 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 2 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 3 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 4 (real) DENSE, size 10x10, density 0.5, nnz 50
</pre>
</div>
......@@ -12044,26 +12044,8 @@ Most of them are also available independently with specific functions.</p>
<div class="output_text output_subarea output_execute_result">
<pre>array([[0. , 0.62887709, 0. , 0.70813682, 0. ,
0.93813718, 0. , 0.09810383, 0.96908782, 0. ],
[0. , 0. , 0.05905911, 0. , 0.60977874,
0.67569916, 0.78679298, 0.14240685, 0. , 0. ],
[0.71585571, 0. , 0. , 0.08785983, 0. ,
0.91204438, 0.58711218, 0.37639551, 0. , 0. ],
[0. , 0.21667768, 0.86927715, 0. , 0. ,
0. , 0.27179985, 0.63996497, 0. , 0.01257363],
[0. , 0.3731035 , 0. , 0. , 0.99943962,
0.50479991, 0. , 0.42877232, 0. , 0.6499954 ],
[0. , 0. , 0. , 0.25189688, 0.34221714,
0. , 0.30246265, 0.26833563, 0. , 0.53966479],
[0.82367369, 0.5016973 , 0. , 0.84232399, 0. ,
0.60169778, 0. , 0. , 0.06992221, 0. ],
[0. , 0.0063866 , 0.15904946, 0. , 0.86380573,
0.57567011, 0. , 0. , 0. , 0.58413662],
[0.84073991, 0. , 0.36580042, 0. , 0.52018371,
0. , 0. , 0.23734494, 0. , 0.68812569],
[0.22434116, 0.74299354, 0.87434391, 0. , 0. ,
0.15227176, 0.7881281 , 0. , 0. , 0. ]])</pre>
<pre>&lt;10x10 sparse matrix of type &#39;&lt;class &#39;numpy.float64&#39;&gt;&#39;
with 50 stored elements in Compressed Sparse Row format&gt;</pre>
</div>
</div>
......@@ -12116,8 +12098,8 @@ Most of them are also available independently with specific functions.</p>
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 10x10, density 1, nnz_sum 100, 2 factor(s):
- FACTOR 0 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 1 (real) SPARSE, size 10x10, density 0.5, nnz 50</pre>
- FACTOR 0 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 1 (real) DENSE, size 10x10, density 0.5, nnz 50</pre>
</div>
</div>
......@@ -12163,8 +12145,8 @@ Most of them are also available independently with specific functions.</p>
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 10x10, density 1, nnz_sum 100, 2 factor(s):
- FACTOR 0 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 1 (real) SPARSE, size 10x10, density 0.5, nnz 50</pre>
- FACTOR 0 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 1 (real) DENSE, size 10x10, density 0.5, nnz 50</pre>
</div>
</div>
......@@ -12211,7 +12193,141 @@ How about plotting a Faust in a more graphical fashion ?</p>
<div class="output_png output_subarea ">
<img src="data:image/png;base64,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
<img src="data:image/png;base64,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
sohIJP4X9iouZSiT918AAAAASUVORK5CYII=
"
>
</div>
......@@ -12259,7 +12375,86 @@ Note that you can change the default <a href="https://matplotlib.org/tutorials/c
<div class="output_png output_subarea ">
<img src="data:image/png;base64,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
<img src="data:image/png;base64,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
SU0y/CQ1yfCT1CSHtNKMMuiN54PcCO9N77OLPT9JTTL8JDXJ8JPUJMNPUpMMP0lNMvwkNcnwk9Qk
w09Skww/SU2aVU94TOdh8Q849LdTti1Jg7PnJ6lJhp+kJhl+kppk+ElqkuEnqUmz6mqvNJ5B7ghw
LMDZxZ6fpCYZfpKaZPhJapLhJ6lJhp+kJhl+kppk+ElqkuEnqUmGn6QmGX6SmmT4SWqS4SepSYaf
pCY5qstGTOVIHEvrninblqTBGX4aupXce/cFdeaNo65jsubsNMjaN0xVGRrfbhNZyPDT0FXV00Zd
g+Q5P0lNMvwkNcnwk9Qkw09Skww/SU0y/CQ1yfCT1CTDT1KTDD9JTTL8JDXJ8JPUJMNPUpMMP0lN
MvwkNcnwk9Qkw09Skww/SU1KVU184eQuYMYNPz5N7OYIxtL0Manwk6TZwsNeSU0y/CQ1yfCT1CTD
T1KTDD9JTTL8JDXJ8JPUJMNPUpMMP0lNMvwkNcnwk9Qkw09Skww/SU0y/KSGJdkqyc+TPL37/Mkk
R426rmEw/KQJSLI8yYNJftP3s/OYZY5KctGIStxU7wAuqKo7u88fAT6YZO4IaxoKw0+auFdV1dZ9
P7cOq+H1hdEUBdTbgVPXfaiqFcAvgVdOwbanNcNPmgJJ9gU+Bfxh1yu8u5u+fZLTktzV9R7flyTd
vD2TXJjkniR3Jzk1yXZ921yR5B+SXAP8diPTPpBkWZKVSZYkeXU3fask9yXZu2+bOyX5bZIdkuwB
LAQuG7M7FwGv2Exf1bRh+ElToKquAY4B/rvrFe7YzfoMMB/YAzgE+Evgrd28ACcAOwH7dMv805hN
vxF4ObDdRqYtBQ7qPn8I+FqSZ1TVQ8A3gcP71n0zcH5V3QPsC9xQVY+MafM6YL9JfQEzkOEnTdw5
XU/qviTnjLdwknnAnwHHVdXKqloGfBw4AqCqllbVD6tqTXfO7ePAwWM2c3JVraiqBzc0raq+WVW3
VdWjVfU1YDmwuFv234E3r+ttdm2vO8zdHli5ntJXdvNmtVl/UlOaQq+tqgsmsfzTgTk8/qVfNwK7
ACR5JvBJer22beh1Ru4as42b17Pdx01LciTwbmC3btLWwI4AVfU/SdYCf5DkXmBX4Lvdcvd27Y61
DXDfuHs3w9nzk6bO2LeB3Qk8wmOhBL3wuaX7/cPAamDfqtoWOJLeofDGtvm4ad15u8/Su2q7Q1Vt
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
TkSuQmCC
"
>
</div>
......@@ -12382,7 +12577,7 @@ Note that you can change the default <a href="https://matplotlib.org/tutorials/c
<div class="output_text output_subarea output_execute_result">
<pre>0.4</pre>
<pre>0.40000000000000002</pre>
</div>
</div>
......@@ -12454,7 +12649,281 @@ Note that you can change the default <a href="https://matplotlib.org/tutorials/c
<div class="output_png output_subarea ">
<img src="data:image/png;base64,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
<img src="data:image/png;base64,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
"
>
</div>
......@@ -12994,12 +13463,12 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 12x14, density 2.1131, nnz_sum 355, 5 factor(s):
- FACTOR 0 (complex) SPARSE, size 12x13, density 0.416667, nnz 65
- FACTOR 1 (complex) SPARSE, size 13x15, density 0.384615, nnz 75
- FACTOR 2 (complex) DENSE, size 15x15, density 0.333333, nnz 75
- FACTOR 3 (complex) SPARSE, size 15x14, density 0.333333, nnz 70
- FACTOR 4 (complex) SPARSE, size 14x14, density 0.357143, nnz 70</pre>
<pre>Faust size 12x13, density 1.92308, nnz_sum 300, 5 factor(s):
- FACTOR 0 (complex) DENSE, size 12x10, density 0.416667, nnz 50
- FACTOR 1 (complex) DENSE, size 10x13, density 0.5, nnz 65
- FACTOR 2 (complex) SPARSE, size 13x12, density 0.384615, nnz 60
- FACTOR 3 (complex) DENSE, size 12x12, density 0.416667, nnz 60
- FACTOR 4 (complex) DENSE, size 12x13, density 0.416667, nnz 65</pre>
</div>
</div>
......@@ -13032,12 +13501,12 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 14x12, density 2.1131, nnz_sum 355, 5 factor(s):
- FACTOR 0 (complex) SPARSE, size 14x14, density 0.357143, nnz 70
- FACTOR 1 (complex) SPARSE, size 14x15, density 0.333333, nnz 70
- FACTOR 2 (complex) DENSE, size 15x15, density 0.333333, nnz 75
- FACTOR 3 (complex) SPARSE, size 15x13, density 0.384615, nnz 75
- FACTOR 4 (complex) SPARSE, size 13x12, density 0.416667, nnz 65</pre>
<pre>Faust size 13x12, density 1.92308, nnz_sum 300, 5 factor(s):
- FACTOR 0 (complex) DENSE, size 13x12, density 0.416667, nnz 65
- FACTOR 1 (complex) DENSE, size 12x12, density 0.416667, nnz 60
- FACTOR 2 (complex) SPARSE, size 12x13, density 0.384615, nnz 60
- FACTOR 3 (complex) DENSE, size 13x10, density 0.5, nnz 65
- FACTOR 4 (complex) DENSE, size 10x12, density 0.416667, nnz 50</pre>
</div>
</div>
......@@ -13070,12 +13539,12 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 12x14, density 2.1131, nnz_sum 355, 5 factor(s):
- FACTOR 0 (complex) SPARSE, size 12x13, density 0.416667, nnz 65
- FACTOR 1 (complex) SPARSE, size 13x15, density 0.384615, nnz 75
- FACTOR 2 (complex) DENSE, size 15x15, density 0.333333, nnz 75
- FACTOR 3 (complex) SPARSE, size 15x14, density 0.333333, nnz 70
- FACTOR 4 (complex) SPARSE, size 14x14, density 0.357143, nnz 70</pre>
<pre>Faust size 12x13, density 1.92308, nnz_sum 300, 5 factor(s):
- FACTOR 0 (complex) DENSE, size 12x10, density 0.416667, nnz 50
- FACTOR 1 (complex) DENSE, size 10x13, density 0.5, nnz 65
- FACTOR 2 (complex) SPARSE, size 13x12, density 0.384615, nnz 60
- FACTOR 3 (complex) DENSE, size 12x12, density 0.416667, nnz 60
- FACTOR 4 (complex) DENSE, size 12x13, density 0.416667, nnz 65</pre>
</div>
</div>
......@@ -13127,15 +13596,15 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 14x14, density 4, nnz_sum 784, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 14x28, density 0.0714286, nnz 28
- FACTOR 1 (real) SPARSE, size 28x28, density 0.178571, nnz 140
- FACTOR 2 (real) SPARSE, size 28x28, density 0.178571, nnz 140
- FACTOR 3 (real) SPARSE, size 28x28, density 0.178571, nnz 140
- FACTOR 4 (real) SPARSE, size 28x28, density 0.178571, nnz 140
- FACTOR 5 (real) SPARSE, size 28x28, density 0.178571, nnz 140
- FACTOR 6 (real) SPARSE, size 28x28, density 0.0357143, nnz 28
- FACTOR 7 (real) SPARSE, size 28x14, density 0.0714286, nnz 28</pre>
<pre>Faust size 13x13, density 4.30769, nnz_sum 728, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 13x26, density 0.0769231, nnz 26
- FACTOR 1 (real) SPARSE, size 26x26, density 0.192308, nnz 130
- FACTOR 2 (real) SPARSE, size 26x26, density 0.192308, nnz 130
- FACTOR 3 (real) SPARSE, size 26x26, density 0.192308, nnz 130
- FACTOR 4 (real) SPARSE, size 26x26, density 0.192308, nnz 130
- FACTOR 5 (real) SPARSE, size 26x26, density 0.192308, nnz 130
- FACTOR 6 (real) SPARSE, size 26x26, density 0.0384615, nnz 26
- FACTOR 7 (real) SPARSE, size 26x13, density 0.0769231, nnz 26</pre>
</div>
</div>
......@@ -13225,15 +13694,15 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 14x14, density 4, nnz_sum 784, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 14x28, density 0.0714286, nnz 28
- FACTOR 1 (real) SPARSE, size 28x28, density 0.178571, nnz 140
- FACTOR 2 (real) SPARSE, size 28x28, density 0.178571, nnz 140
- FACTOR 3 (real) SPARSE, size 28x28, density 0.178571, nnz 140
- FACTOR 4 (real) SPARSE, size 28x28, density 0.178571, nnz 140
- FACTOR 5 (real) SPARSE, size 28x28, density 0.178571, nnz 140
- FACTOR 6 (real) SPARSE, size 28x28, density 0.0357143, nnz 28
- FACTOR 7 (real) SPARSE, size 28x14, density 0.0714286, nnz 28</pre>
<pre>Faust size 13x13, density 4.30769, nnz_sum 728, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 13x26, density 0.0769231, nnz 26
- FACTOR 1 (real) SPARSE, size 26x26, density 0.192308, nnz 130
- FACTOR 2 (real) SPARSE, size 26x26, density 0.192308, nnz 130
- FACTOR 3 (real) SPARSE, size 26x26, density 0.192308, nnz 130
- FACTOR 4 (real) SPARSE, size 26x26, density 0.192308, nnz 130
- FACTOR 5 (real) SPARSE, size 26x26, density 0.192308, nnz 130
- FACTOR 6 (real) SPARSE, size 26x26, density 0.0384615, nnz 26
- FACTOR 7 (real) SPARSE, size 26x13, density 0.0769231, nnz 26</pre>
</div>
</div>
......@@ -13275,15 +13744,15 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 14x14, density 2.57143, nnz_sum 504, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 14x28, density 0.0714286, nnz 28
- FACTOR 1 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 2 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 3 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 4 (real) SPARSE, size 28x15, density 0.2, nnz 84
- FACTOR 5 (real) SPARSE, size 15x28, density 0.2, nnz 84
- FACTOR 6 (real) SPARSE, size 28x28, density 0.0357143, nnz 28
- FACTOR 7 (real) SPARSE, size 28x14, density 0.0714286, nnz 28</pre>
<pre>Faust size 13x13, density 2.76923, nnz_sum 468, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 13x26, density 0.0769231, nnz 26
- FACTOR 1 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 2 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 3 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 4 (real) SPARSE, size 26x14, density 0.214286, nnz 78
- FACTOR 5 (real) SPARSE, size 14x26, density 0.214286, nnz 78
- FACTOR 6 (real) SPARSE, size 26x26, density 0.0384615, nnz 26
- FACTOR 7 (real) SPARSE, size 26x13, density 0.0769231, nnz 26</pre>
</div>
</div>
......@@ -13326,15 +13795,15 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 14x14, density 2.57143, nnz_sum 504, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 14x28, density 0.0714286, nnz 28
- FACTOR 1 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 2 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 3 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 4 (real) SPARSE, size 28x15, density 0.2, nnz 84
- FACTOR 5 (real) SPARSE, size 15x28, density 0.2, nnz 84
- FACTOR 6 (real) SPARSE, size 28x28, density 0.0357143, nnz 28
- FACTOR 7 (real) SPARSE, size 28x14, density 0.0714286, nnz 28</pre>
<pre>Faust size 13x13, density 2.76923, nnz_sum 468, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 13x26, density 0.0769231, nnz 26
- FACTOR 1 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 2 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 3 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 4 (real) SPARSE, size 26x14, density 0.214286, nnz 78
- FACTOR 5 (real) SPARSE, size 14x26, density 0.214286, nnz 78
- FACTOR 6 (real) SPARSE, size 26x26, density 0.0384615, nnz 26
- FACTOR 7 (real) SPARSE, size 26x13, density 0.0769231, nnz 26</pre>
</div>
</div>
......@@ -13367,15 +13836,15 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 14x14, density 2.57143, nnz_sum 504, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 14x28, density 0.0714286, nnz 28
- FACTOR 1 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 2 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 3 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 4 (real) SPARSE, size 28x15, density 0.2, nnz 84
- FACTOR 5 (real) SPARSE, size 15x28, density 0.2, nnz 84
- FACTOR 6 (real) SPARSE, size 28x28, density 0.0357143, nnz 28
- FACTOR 7 (real) SPARSE, size 28x14, density 0.0714286, nnz 28</pre>
<pre>Faust size 13x13, density 2.76923, nnz_sum 468, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 13x26, density 0.0769231, nnz 26
- FACTOR 1 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 2 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 3 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 4 (real) SPARSE, size 26x14, density 0.214286, nnz 78
- FACTOR 5 (real) SPARSE, size 14x26, density 0.214286, nnz 78
- FACTOR 6 (real) SPARSE, size 26x26, density 0.0384615, nnz 26
- FACTOR 7 (real) SPARSE, size 26x13, density 0.0769231, nnz 26</pre>
</div>
</div>
......@@ -13417,15 +13886,15 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 14x14, density 3.5, nnz_sum 686, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 14x28, density 0.0714286, nnz 28
- FACTOR 1 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 2 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 3 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 4 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 5 (real) SPARSE, size 28x28, density 0.339286, nnz 266
- FACTOR 6 (real) SPARSE, size 28x28, density 0.0357143, nnz 28
- FACTOR 7 (real) SPARSE, size 28x14, density 0.0714286, nnz 28</pre>
<pre>Faust size 13x13, density 3.69231, nnz_sum 624, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 13x26, density 0.0769231, nnz 26
- FACTOR 1 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 2 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 3 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 4 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 5 (real) SPARSE, size 26x26, density 0.346154, nnz 234
- FACTOR 6 (real) SPARSE, size 26x26, density 0.0384615, nnz 26
- FACTOR 7 (real) SPARSE, size 26x13, density 0.0769231, nnz 26</pre>
</div>
</div>
......@@ -13458,15 +13927,15 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 14x14, density 3.5, nnz_sum 686, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 14x28, density 0.0714286, nnz 28
- FACTOR 1 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 2 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 3 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 4 (real) SPARSE, size 28x28, density 0.107143, nnz 84
- FACTOR 5 (real) SPARSE, size 28x28, density 0.339286, nnz 266
- FACTOR 6 (real) SPARSE, size 28x28, density 0.0357143, nnz 28
- FACTOR 7 (real) SPARSE, size 28x14, density 0.0714286, nnz 28</pre>
<pre>Faust size 13x13, density 3.69231, nnz_sum 624, 8 factor(s):
- FACTOR 0 (real) SPARSE, size 13x26, density 0.0769231, nnz 26
- FACTOR 1 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 2 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 3 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 4 (real) SPARSE, size 26x26, density 0.115385, nnz 78
- FACTOR 5 (real) SPARSE, size 26x26, density 0.346154, nnz 234
- FACTOR 6 (real) SPARSE, size 26x26, density 0.0384615, nnz 26
- FACTOR 7 (real) SPARSE, size 26x13, density 0.0769231, nnz 26</pre>
</div>
</div>
......@@ -13554,7 +14023,7 @@ ASAAAECQIQAEAAAIMv8fomx0rLQsLooAAAAASUVORK5CYII=
<div class="output_text output_subarea output_execute_result">
<pre>1.6302033570749947e-16</pre>
<pre>1.5276725686333651e-16</pre>
</div>
</div>
......@@ -13639,12 +14108,12 @@ FG is a Faust too!</p>
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 14x14, density 1.78571, nnz_sum 350, 5 factor(s):
- FACTOR 0 (real) SPARSE, size 14x14, density 0.357143, nnz 70
- FACTOR 1 (real) DENSE, size 14x14, density 0.357143, nnz 70
- FACTOR 2 (real) DENSE, size 14x14, density 0.357143, nnz 70
- FACTOR 3 (real) DENSE, size 14x14, density 0.357143, nnz 70
- FACTOR 4 (real) DENSE, size 14x14, density 0.357143, nnz 70</pre>
<pre>Faust size 13x13, density 1.92308, nnz_sum 325, 5 factor(s):
- FACTOR 0 (real) SPARSE, size 13x13, density 0.384615, nnz 65
- FACTOR 1 (real) DENSE, size 13x13, density 0.384615, nnz 65
- FACTOR 2 (real) SPARSE, size 13x13, density 0.384615, nnz 65
- FACTOR 3 (real) DENSE, size 13x13, density 0.384615, nnz 65
- FACTOR 4 (real) SPARSE, size 13x13, density 0.384615, nnz 65</pre>
</div>
</div>
......@@ -13657,7 +14126,7 @@ FG is a Faust too!</p>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p><strong>Note about Python 2.7</strong>: the operations op+F, op*F, op-F, where op is of type numpy.ndarray or numpy.matrix are not supported in pyfaust for Python 2.7 (contrary to F+op, F-op, F*op that are supported for Python 2.7).</p>
<p><strong>Note about Python 2.7</strong>: the operations op*F where op is of type numpy.ndarray or numpy.matrix are not supported in pyfaust for Python 2.7 (contrary to F*op that is supported for Python 2.7).</p>
</div>
</div>
......@@ -13697,20 +14166,19 @@ FG is a Faust too!</p>
<div class="output_text output_subarea output_execute_result">
<pre>array([[71.86183514],
[38.10372552],
[45.53868865],
[70.94932911],
[43.57079436],
[62.98652372],
[52.46907666],
[41.27303448],
[34.03400294],
[50.80843175],
[38.97772624],
[34.94785561],
[52.59190023],
[39.89015229]])</pre>
<pre>array([[ 47.08320887],
[ 48.92241997],
[ 47.22848147],
[ 59.1297748 ],
[ 38.90236538],
[ 40.01572454],
[ 46.81942327],
[ 25.97223946],
[ 36.58778821],
[ 46.20416627],
[ 38.90694405],
[ 19.29944959],
[ 31.33946958]])</pre>
</div>
</div>
......@@ -13751,7 +14219,7 @@ FG is a Faust too!</p>
<div class="output_subarea output_stream output_stdout output_text">
<pre>13.2 µs ± 911 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
<pre>13.5 µs ± 1.29 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
</pre>
</div>
</div>
......@@ -13795,7 +14263,7 @@ FG is a Faust too!</p>
<div class="output_subarea output_stream output_stdout output_text">
<pre>4.92 µs ± 629 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
<pre>4.98 µs ± 391 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
</pre>
</div>
</div>
......@@ -13862,7 +14330,7 @@ FG is a Faust too!</p>
<div class="output_text output_subarea output_execute_result">
<pre>0.5599999999999999</pre>
<pre>0.52000000000000002</pre>
</div>
</div>
......@@ -13917,7 +14385,7 @@ FG is a Faust too!</p>
<div class="output_subarea output_stream output_stdout output_text">
<pre>29 µs ± 5.36 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
<pre>22.4 µs ± 312 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
</pre>
</div>
</div>
......@@ -13948,7 +14416,7 @@ FG is a Faust too!</p>
<div class="output_subarea output_stream output_stdout output_text">
<pre>875 µs ± 140 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
<pre>476 µs ± 92.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
</pre>
</div>
</div>
......@@ -13981,7 +14449,7 @@ FG is a Faust too!</p>
<div class="output_text output_subarea output_execute_result">
<pre>341.3333333333333</pre>
<pre>341.33333333333331</pre>
</div>
</div>
......@@ -14026,7 +14494,7 @@ I hope the example above has finished to convince you.</p>
<div class="output_text output_subarea output_execute_result">
<pre>4.2182769441228084e-16</pre>
<pre>4.0731473265507737e-16</pre>
</div>
</div>
......@@ -14079,7 +14547,7 @@ I hope the example above has finished to convince you.</p>
<div class="output_subarea output_stream output_stdout output_text">
<pre>703 µs ± 75.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
<pre>529 µs ± 62.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
</pre>
</div>
</div>
......@@ -14110,7 +14578,7 @@ I hope the example above has finished to convince you.</p>
<div class="output_subarea output_stream output_stdout output_text">
<pre>4.05 ms ± 641 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
<pre>8.59 ms ± 1.34 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
</pre>
</div>
</div>
......@@ -14143,7 +14611,7 @@ I hope the example above has finished to convince you.</p>
<div class="output_text output_subarea output_execute_result">
<pre>1.144847938386667e-16</pre>
<pre>1.1321188248976998e-16</pre>
</div>
</div>
......@@ -14197,7 +14665,7 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>151.9264379964429</pre>
<pre>160.94032601139284</pre>
</div>
</div>
......@@ -14230,7 +14698,7 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>135.67043961503845</pre>
<pre>126.92637308212312</pre>
</div>
</div>
......@@ -14263,7 +14731,7 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>102.43322043664675</pre>
<pre>99.35532103959507</pre>
</div>
</div>
......@@ -14306,7 +14774,7 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>151.9264379964429</pre>
<pre>160.94032601139284</pre>
</div>
</div>
......@@ -14339,7 +14807,7 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>135.67043961503845</pre>
<pre>126.92637308212312</pre>
</div>
</div>
......@@ -14372,7 +14840,7 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>102.43322043664675</pre>
<pre>99.355321039595069</pre>
</div>
</div>
......@@ -14412,7 +14880,7 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_subarea output_stream output_stdout output_text">
<pre>454 µs ± 25.4 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
<pre>739 µs ± 57.5 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
</pre>
</div>
</div>
......@@ -14443,7 +14911,7 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_subarea output_stream output_stdout output_text">
<pre>922 ms ± 23.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
<pre>796 ms ± 57.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
</pre>
</div>
</div>
......@@ -14486,7 +14954,7 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>0.00025046807335009575</pre>
<pre>0.00061486173772805472</pre>
</div>
</div>
......@@ -14509,7 +14977,6 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="text_cell_render border-box-sizing rendered_html">
<p>The FAµST API proposes a group of normalizations. They correspond to the norms available and discussed above.</p>
<p>It's possible to normalize along columns or rows with any type of these norms.</p>
<p><strong>NOTE for Windows users:</strong> Faust.normalize() is currently buggy in only one case: you're using python3 on Windows and you installed pyfaust with a pip pre-compiled package. Sorry for the inconvenience, the bug is on the to-fix list.</p>
</div>
</div>
......@@ -14572,8 +15039,8 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 10x10, density 2.5, nnz_sum 250, 5 factor(s):
- FACTOR 0 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 1 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 0 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 1 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 2 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 3 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 4 (real) DENSE, size 10x10, density 0.5, nnz 50</pre>
......@@ -14610,8 +15077,8 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 10x10, density 2.6, nnz_sum 260, 6 factor(s):
- FACTOR 0 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 1 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 0 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 1 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 2 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 3 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 4 (real) DENSE, size 10x10, density 0.5, nnz 50
......@@ -14648,26 +15115,26 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>matrix([[0.01863705, 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ],
[0. , 0.02040914, 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0.08664165, 0. , 0. ,
0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0.08566691, 0. ,
0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. , 0.01866238,
0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. , 0. ,
0.06432877, 0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. , 0. ,
0. , 0.02429912, 0. , 0. , 0. ],
[0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0.02509563, 0. , 0. ],
[0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0.07776694, 0. ],
[0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0.1168775 ]])</pre>
<pre>matrix([[ 0.05115476, 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ],
[ 0. , 0.06499964, 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0.05403455, 0. , 0. ,
0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0.04759628, 0. ,
0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0.03982301,
0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0.03516077, 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0.03145437, 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0.21265708, 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0.03711339, 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0.08153877]])</pre>
</div>
</div>
......@@ -14703,7 +15170,7 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>1.5856970067962071e-15</pre>
<pre>1.5738497793445163e-15</pre>
</div>
</div>
......@@ -14766,16 +15233,16 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>array([[0.0415841 , 0.4784894 , 0.25553643, 0.69127677, 0.09124659],
[0.95590652, 0.70007871, 0.67033617, 0.66702459, 0.44313375],
[0.43419902, 0.95090089, 0.85683281, 0.08758949, 0.75491315],
[0.48741154, 0.07889868, 0.93861573, 0.6449647 , 0.22900974],
[0.573258 , 0.17743034, 0.59216562, 0.93825686, 0.51548418],
[1. , 0. , 0. , 0. , 0. ],
[0. , 1. , 0. , 0. , 0. ],
[0. , 0. , 1. , 0. , 0. ],
[0. , 0. , 0. , 1. , 0. ],
[0. , 0. , 0. , 0. , 1. ]])</pre>
<pre>array([[ 0.98824777, 0.8416767 , 0.10987026, 0.52692037, 0.23099392],
[ 0.79539152, 0.61388666, 0.24066613, 0.8795504 , 0.05511843],
[ 0.47286912, 0.1893449 , 0.77935439, 0.82953017, 0.08993922],
[ 0.21982767, 0.70992636, 0.95762212, 0.27294071, 0.98437245],
[ 0.76053662, 0.28169856, 0.16161273, 0.60498563, 0.29763943],
[ 1. , 0. , 0. , 0. , 0. ],
[ 0. , 1. , 0. , 0. , 0. ],
[ 0. , 0. , 1. , 0. , 0. ],
[ 0. , 0. , 0. , 1. , 0. ],
[ 0. , 0. , 0. , 0. , 1. ]])</pre>
</div>
</div>
......@@ -14809,16 +15276,16 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>array([[0.0415841 , 0.4784894 , 0.25553643, 0.69127677, 0.09124659,
1. , 0. , 0. , 0. , 0. ],
[0.95590652, 0.70007871, 0.67033617, 0.66702459, 0.44313375,
0. , 1. , 0. , 0. , 0. ],
[0.43419902, 0.95090089, 0.85683281, 0.08758949, 0.75491315,
0. , 0. , 1. , 0. , 0. ],
[0.48741154, 0.07889868, 0.93861573, 0.6449647 , 0.22900974,
0. , 0. , 0. , 1. , 0. ],
[0.573258 , 0.17743034, 0.59216562, 0.93825686, 0.51548418,
0. , 0. , 0. , 0. , 1. ]])</pre>
<pre>array([[ 0.98824777, 0.8416767 , 0.10987026, 0.52692037, 0.23099392,
1. , 0. , 0. , 0. , 0. ],
[ 0.79539152, 0.61388666, 0.24066613, 0.8795504 , 0.05511843,
0. , 1. , 0. , 0. , 0. ],
[ 0.47286912, 0.1893449 , 0.77935439, 0.82953017, 0.08993922,
0. , 0. , 1. , 0. , 0. ],
[ 0.21982767, 0.70992636, 0.95762212, 0.27294071, 0.98437245,
0. , 0. , 0. , 1. , 0. ],
[ 0.76053662, 0.28169856, 0.16161273, 0.60498563, 0.29763943,
0. , 0. , 0. , 0. , 1. ]])</pre>
</div>
</div>
......@@ -14912,26 +15379,26 @@ This function is really close to <code>numpy.linalg.norm</code> function.</p>
<div class="output_text output_subarea output_execute_result">
<pre>matrix([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.]])</pre>
<pre>matrix([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.]])</pre>
</div>
</div>
......@@ -15016,7 +15483,6 @@ Besides, it's possible to concatenate an arbitrary number of Faust objects.</p>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Sometimes you need to access the dense matrix corresponding to a Faust or an element of it (by the way, note that it's costly).</p>
<p><strong>NOTE for Windows users:</strong> Faust slicing (for more than one item) is currently buggy in only one case: you're using python3 on Windows and you installed pyfaust with a pip pre-compiled package. Sorry for the inconvenience, the bug is on the to-fix list.</p>
<p>Let's access a Faust item:</p>
</div>
......@@ -15046,7 +15512,7 @@ Besides, it's possible to concatenate an arbitrary number of Faust objects.</p>
<div class="output_text output_subarea output_execute_result">
<pre>3.248009374477628</pre>
<pre>7.690151586000086</pre>
</div>
</div>
......@@ -15086,7 +15552,7 @@ Besides, it's possible to concatenate an arbitrary number of Faust objects.</p>
<div class="output_subarea output_stream output_stdout output_text">
<pre>35.8 µs ± 5.26 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
<pre>39.8 µs ± 7.08 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
</pre>
</div>
</div>
......@@ -15117,7 +15583,7 @@ Besides, it's possible to concatenate an arbitrary number of Faust objects.</p>
<div class="output_subarea output_stream output_stdout output_text">
<pre>1.14 µs ± 73.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
<pre>1.46 µs ± 191 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
</pre>
</div>
</div>
......@@ -15161,8 +15627,8 @@ Besides, it's possible to concatenate an arbitrary number of Faust objects.</p>
<div class="output_text output_subarea output_execute_result">
<pre>Faust size 3x7, density 9.42857, nnz_sum 198, 5 factor(s):
- FACTOR 0 (real) SPARSE, size 3x10, density 0.5, nnz 15
- FACTOR 1 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 0 (real) DENSE, size 3x10, density 0.5, nnz 15
- FACTOR 1 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 2 (real) SPARSE, size 10x10, density 0.5, nnz 50
- FACTOR 3 (real) DENSE, size 10x10, density 0.5, nnz 50
- FACTOR 4 (real) DENSE, size 10x7, density 0.471429, nnz 33</pre>
......@@ -15275,7 +15741,6 @@ Besides, it's possible to concatenate an arbitrary number of Faust objects.</p>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Yes it is!</p>
<p><strong>NOTE for Windows users:</strong> Faust fancy indexing is currently buggy on Windows platforms. Sorry for the inconvenience, the bug is on the to-fix list.</p>
</div>
</div>
......
%% Cell type:markdown id: tags:
# How to Manipulate a Faust
<a name="start"></a>
This notebook is intended to gently introduce the operations available to manipulate a Faust object.
It comes after the first notebook (available [here](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/Faust_creation.ipynb) for download or [here](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/Faust_creation.html) as a web page), so it's assumed you already know how to create a Faust object from one way or another.
Keep in mind that a full API doc is available [here](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/namespacepyfaust.html) every time you need details. In particular the Faust class is documented [here](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html).
**NOTE**: the notebook is made to be executed sequentially, otherwise, skipping some cells, you would end up on an import error.
# Table of Contents:
[**1. Getting Basic Information about a Faust Object**](#1.-Getting-Basic-Information-about-a-Faust-Object)<br/>
[1.1 Obtaining Dimension and Scalar Type Information](#1.1-Obtaining-Dimension-and-Scalar-Type-Information)<br/>
[1.2 Obtaining Other Faust Specific Information](#1.2-Obtaining-Other-Faust-Specific-Information)<br/>
[1.3 Plotting a Faust](#1.3-Plotting-a-Faust)<br/>
[1.4 About Sparsity!](#1.4-About-Sparsity!)<br/>
[**2. Faust Algebra and other Operations**](#2.-Faust-Algebra-and-other-Operations)<br/>
[2.1 Transpose, conjugate, transconjugate](#2.1-Transpose,-conjugate,-transconjugate)<br/>
[2.2 Add, Subtract and Multiply](#2.2-Add,-Subtract-and-Multiply)<br/>
[2.3 Faust Multiplication by a Vector or a Matrix](#2.3-Faust-Multiplication-by-a-Vector-or-a-Matrix)<br/>
[2.4 Faust Norms](#2.4-Faust-Norms)<br/>
[2.5 Faust Normalizations](#2.5-Faust-Normalizations)<br/>
[2.6 Faust Concatenation](#2.6-Faust-Concatenation)<br/>
[2.7 Faust Indexing and Slicing](#2.7-Faust-Indexing-and-Slicing)<br/>
# 1. Getting Basic Information about a Faust Object
First of all, given any object, you might ask yourself if it's a Faust or not (typically when you receive an object in a function, python being built on dynamic types, you can't say for sure it's a Faust).
[Faust.isFaust()](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#a965047e6c0161e59a1c3e08f2b60e806) is the function to verify an object is a Faust.
It's use is straighforward as you can see in the [documentation](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#a965047e6c0161e59a1c3e08f2b60e806).
### 1.1 Obtaining Dimension and Scalar Type Information
Firstly, let's list basic Faust informative methods/attributes you're probably used to for numpy arrays:
- [shape](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#a64b167c138d18a23bb5b9794fcb03ef1),
- [size](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#a6505fdc600b4868bbe77d8fc4a48b350),
- [dtype](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#ad0615fb9508899a95af2c7de42377e91).
To keep it really clear, let's show some examples operated on a random Faust.
%% Cell type:code id: tags:
``` python
from pyfaust import FaustFactory as FF
F = FF.rand(5,10)
print(F)
```
%% Cell type:code id: tags:
``` python
F.shape
```
%% Cell type:code id: tags:
``` python
F.size
```
%% Cell type:code id: tags:
``` python
F.dtype
```
%% Cell type:markdown id: tags:
If the attributes printed out above seem not clear to you, you're probably not a numpy user. Anyway you'll find all descriptive informations in the FAµST API documentation (see the links [above](#start)).
As a complement, you can also refer to the numpy API documentation:
- [shape](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.shape.html)
- [size](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.size.html)
- [dtype](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.dtype.html)
About shape, it's noteworthy that contrary to what numpy is capable of, you _cannot_ [reshape](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.reshape.html) a Faust.
%% Cell type:markdown id: tags:
### 1.2 Obtaining Other Faust Specific Information
As you've seen in this notebook and the [first one](#start), when you print a Faust object, several pieces of information appear.
Most of them are also available independently with specific functions.
For instance, if you want information about factors, nothing is more simple than calling directly the next functions:
- [get_num_factors()](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#a2b46d3c068ef20d74bb90e382848014e) ; which gives you the number of factors (aka layers) a Faust object is composed of.
- [get_factor()](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#adc91fd04c17ccaa2f32b7423955ef37d) ; which allows you to copy any of the Faust's factors givens its index.
Going back to our F object, let's call these functions:
%% Cell type:code id: tags:
``` python
F.get_num_factors()
```
%% Cell type:markdown id: tags:
For example, try to copy the third factor:
%% Cell type:code id: tags:
``` python
f3 = F.get_factor(2)
f3
```
%% Cell type:markdown id: tags:
Note that, since Faust 2.3, the function doesn't alterate the factor format. If the Faust object contains a sparse factor then you'll receive a sparse (CSR) matrix.
%% Cell type:markdown id: tags:
Contrary to what the singular form of 'get_factor' indicates, it's possible (since Faust 2.3 again) to retrieve a sub-sequence of Faust factors.
Go straight to the example, extracting factors from F:
%% Cell type:code id: tags:
``` python
F.get_factor(range(2,4))
```
%% Cell type:markdown id: tags:
Hmm... something is different from the previous example. We indeed received a Faust as return type, great! You've just learned another way to create a Faust from another, additionally to what you've seen in the first [notebook](#start).
Without this function, you'd surely have written something similar to:
%% Cell type:code id: tags:
``` python
from pyfaust import Faust
F2 = Faust([F.get_factor(2), F.get_factor(3)])
F2
```
%% Cell type:markdown id: tags:
OK, that's not awful but I let you imagine how much complicated it is with more factors (even with a list comprehension, it's longer to write).
### 1.3 Plotting a Faust
It's quite useful to print a Faust as we've seen before, calling ``print(F)`` or ``F.display()`` or just ``F`` in an interactive terminal but this is wordy.
How about plotting a Faust in a more graphical fashion ?
%% Cell type:code id: tags:
``` python
import matplotlib.pyplot as plt
%matplotlib inline
F.imshow()
plt.show()
```
%% Cell type:markdown id: tags:
What do we see above ? On the bottom left is the dense matrix associated to F, obtained with ```F.toarray()```. On the top are the indexed factors of F.
Note that you can change the default [colormap](https://matplotlib.org/tutorials/colors/colormaps.html) in matplotlib parameters.
Another example is worth a thousand words.
%% Cell type:code id: tags:
``` python
from pyfaust import Faust
from numpy import eye
Faust([eye(5,4),eye(4,10)]).imshow()
```
%% Cell type:markdown id: tags:
The dimension ratio of the factors is respected in the figure.
### 1.4 About Sparsity!
Three functions of the Faust class are here to evaluate the sparsity of a Faust object.
Let's call the first one:
%% Cell type:code id: tags:
``` python
F.nnz_sum()
```
%% Cell type:markdown id: tags:
I'm sure you guessed exactly what the function returns, if you doubt it, here is the doc: [Faust.nnz_sum()](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#a216c598bb384d92b4e37843b67c42255). The smaller ```nnz_sum```, the sparser the Faust.
Next comes the function: [Faust.density()](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#af73ecb7c5fca3c7673c665d8ba4058f6).
This function along with its reciprocal [Faust.rcg()](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#a6a51a05c20041504a0b8f2a73dd8d05a) can give you a big hint on how much your Faust is potentially optimized both for storage and calculation. The sparser the Faust, the larger the Relative Complexity Gain (RCG)!
%% Cell type:code id: tags:
``` python
F.density()
```
%% Cell type:code id: tags:
``` python
F.rcg()
```
%% Cell type:markdown id: tags:
According to its RCG, this Faust doesn't seem to be of any help for optimization but look at the graphic the next script generates:
%% Cell type:code id: tags:
``` python
from pyfaust import Faust, FaustFactory
import numpy as np
import os
import matplotlib.pyplot as plt
nfactors = 3
startd = 0.01
endd = 1
dim_sz = 1000
sizes = []
rcs = []
ntests = 10
for i, d in zip(
list(range(0, ntests)),
np.linspace(startd, endd, ntests)):
F = FaustFactory.rand(nfactors, dim_sz, d, fac_type='sparse')
filepath = 'test_faust_size'+str(i)+'.mat'
F.save(filepath)
stat = os.stat(filepath)
sizes.append(stat.st_size)
rcs.append(F.density())
os.remove(filepath)
plt.title('File Size vs Density for Pure-Sparse Fausts \n('+str(nfactors)+' '
'random factors '+str(dim_sz)+'x'+str(dim_sz)+')')
plt.xlabel('Density')
plt.ylabel('File Size (bytes)')
plt.rcParams['figure.figsize'] = [8.0, 6]
plt.tight_layout()
plt.plot(rcs, sizes)
plt.show()
```
%% Cell type:markdown id: tags:
Isn't it obvious now that the smaller the density the better?! Indeed, for two Faust objects of the same shape and the same number of factors, a smaller density (linearly) implies a smaller file size for storage.
This point applies also to the memory (RAM) space to work on a Faust.
We'll see later how the computation can benefit of a bigger RCG (or smaller density). But let's point out right now that the sparsity is often a tradeoff with accuracy, as the following plot shows about the truncated [SVD](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.svd.html) of a matrix $M \in {\mathbb R}^{512 \times 512}$. Note beforehand that the SVD of M (truncated or not) can be seen as a Faust which approximates M.
```
Faust([U,S,V])
```
<img src="data:image/png;base64,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
"/>
Here is the script to reproduce the last figure: [test_svd_rc_vs_err.py](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/test_svd_rc_vs_err.py)
%% Cell type:markdown id: tags:
# 2. Faust Algebra and other Operations
%% Cell type:markdown id: tags:
In order to write some nice algorithms using Faust objects, you'll have to use the basic "stable" operations a Faust is capable of. Let's make a tour of them.
### 2.1 Transpose, conjugate, transconjugate
- [Faust.T](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#a064a412cac321f8211098db0fae84e8e)
- [Faust.conj](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#abd273a0e1684a7b238798ac82cd07a61)
- [Faust.H](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#ac7b77cdde5f66f85b6458594aa01ad31)
You are probably familiar with [T](https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.T.html) and [H](https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.H.html) attributes/properties from numpy/scipy. Well, they are also used in the Faust class.
%% Cell type:code id: tags:
``` python
G = FF.rand(5,[10,15],field='complex')
```
%% Cell type:code id: tags:
``` python
G.T
```
%% Cell type:code id: tags:
``` python
G.conj()
```
%% Cell type:code id: tags:
``` python
G.H
```
%% Cell type:markdown id: tags:
What really matters here is that the results of G.T, G.conj() and G.H are all Faust objects. Behind the scene, there is just one memory zone allocated to the factors. Strictly speaking they are memory views shared between G, G.T and G.H. So don't hesitate to use!
%% Cell type:markdown id: tags:
### 2.2 Add, Subtract and Multiply
%% Cell type:code id: tags:
``` python
F = FF.rand(5,G.shape[0])
G = FF.rand(5,G.shape[0])
F+G
```
%% Cell type:markdown id: tags:
Go ahead and verify it's accurate.
%% Cell type:code id: tags:
``` python
from numpy.linalg import norm
norm((F+G).toarray()-(F.toarray()+G.toarray()))
```
%% Cell type:markdown id: tags:
Some points are noticeable here:
- F is real (dtype float), but G is complex. The Faust API is able to return the proper type for the resulting Faust, that is a complex Faust.
- F+G is composed of 8 factors, however F and G are both 5 factors long. It's due to the way the addition is implemented (Faust concatenation is hiding behind).
Subtracting is not different:
%% Cell type:code id: tags:
``` python
F-G
```
%% Cell type:markdown id: tags:
You can also add/subtract scalars to Faust objects.
%% Cell type:code id: tags:
``` python
F+2
```
%% Cell type:markdown id: tags:
Note that here again ```(F+2).get_num_factors() != F.get_num_factors()```
But conversely you can also add/subtract a Faust to a scalar (pay attention to the order of operands):
%% Cell type:code id: tags:
``` python
2+F
```
%% Cell type:code id: tags:
``` python
2-F
```
%% Cell type:markdown id: tags:
The FAµST API support equally the Faust to array addition and subtraction.
%% Cell type:code id: tags:
``` python
F.toarray()+F # or F+F.toarray()
```
%% Cell type:code id: tags:
``` python
F-F.toarray() # F.toarray()-F is supported too
```
%% Cell type:code id: tags:
``` python
((F.toarray()-F).toarray() == 0).all()
```
%% Cell type:markdown id: tags:
Now let's multiply these Fausts!
%% Cell type:code id: tags:
``` python
FG = F*G
```
%% Cell type:code id: tags:
``` python
norm(FG.todense()-F.todense()*G.todense())/norm(F.todense()*G.todense())
```
%% Cell type:markdown id: tags:
The relative error proves it's working.
FG is a Faust too!
%% Cell type:code id: tags:
``` python
Faust.isFaust(FG)
```
%% Cell type:markdown id: tags:
Faust scalar multiplication is also available and here again the result is a Faust object!
%% Cell type:code id: tags:
``` python
F*2 # or 2*F
```
%% Cell type:markdown id: tags:
**Note about Python 2.7**: the operations op+F, op\*F, op-F, where op is of type numpy.ndarray or numpy.matrix are not supported in pyfaust for Python 2.7 (contrary to F+op, F-op, F\*op that are supported for Python 2.7).
**Note about Python 2.7**: the operations op\*F where op is of type numpy.ndarray or numpy.matrix are not supported in pyfaust for Python 2.7 (contrary to F\*op that is supported for Python 2.7).
%% Cell type:markdown id: tags:
### 2.3 Faust Multiplication by a Vector or a Matrix
When you multiply a Faust by a vector or a matrix (which must be dense by the way -- more precisely, a ```numpy.ndarray``` with good ```ndim``` and ```shape```), you'll get respectively a vector or a matrix as result.
%% Cell type:code id: tags:
``` python
from numpy.random import rand
vec = rand(F.shape[1],1)
F*vec # or F.dot(vec), F*vec, (or only with python3) F@vec
```
%% Cell type:markdown id: tags:
Let's launch a timer to compare the execution times of Faust-vector multiplication and Faust's dense matrix-vector multiplication
Note that appliying a Faust on a ```numpy.ndarray``` or a ```numpy.matrix``` can be done with the function dot(), the operator @ (python3 only) or \* exactly as ```numpy.matrix``` allows. Indeed, a Faust is to be seen as a ```numpy.matrix``` not a ```numpy.ndarray``` (for the latter the two operators are not the same, \* performs an elementwise multiplication while @ or dot() is the matrix product).
%% Cell type:code id: tags:
``` python
timeit F*vec
```
%% Cell type:code id: tags:
``` python
FD = F.todense() # be careful: todense() returns a matrix while toarray() a ndarray
```
%% Cell type:code id: tags:
``` python
timeit FD*vec
```
%% Cell type:code id: tags:
``` python
from numpy import allclose
allclose(F*vec,FD*vec)
```
%% Cell type:code id: tags:
``` python
F.rcg()
```
%% Cell type:markdown id: tags:
When the RCG is lower than 1 the Faust-vector multiplication is slower. Making a random Faust with a large RCG (small density) shows better results.
%% Cell type:code id: tags:
``` python
G = FF.rand(3, 1024, density=.001, fac_type='sparse')
GD = G.todense()
vec2 = rand(1024, 1)
```
%% Cell type:code id: tags:
``` python
timeit G*vec2
```
%% Cell type:code id: tags:
``` python
timeit GD*vec2
```
%% Cell type:code id: tags:
``` python
G.rcg()
```
%% Cell type:markdown id: tags:
It goes without saying that a big RCG gives a big speedup to the Faust-vector multiplication relatively to the corresponding (dense) matrix-vector multiplication.
I hope the example above has finished to convince you.
Just to convince you as well of the Faust-vector multiplication accuracy:
%% Cell type:code id: tags:
``` python
from numpy.linalg import norm
norm(G*vec2 - GD*vec2)
```
%% Cell type:markdown id: tags:
What applies to Faust-vector multiplication remains valid about Faust-matrix multiplication. Take a look:
%% Cell type:code id: tags:
``` python
M = rand(1024,32)
```
%% Cell type:code id: tags:
``` python
timeit G*M
```
%% Cell type:code id: tags:
``` python
timeit GD*M
```
%% Cell type:code id: tags:
``` python
norm(GD*M-G*M)/norm(GD*M)
```
%% Cell type:markdown id: tags:
Well, what do we see? A quicker Faust-matrix multiplication than the matrix-matrix corresponding multiplication, though a good accuracy of the Faust-matrix multiplication is also clearly confirmed.
These examples are somehow theoretical because we cherry-pick the Faust to ensure that the RCG is good to accelerate the muplication, but at least it shows the potential speedup using Faust objects.
%% Cell type:markdown id: tags:
### 2.4 Faust Norms
The Faust class provides a norm function which handles different types of norms.
This function is really close to ```numpy.linalg.norm``` function.
In the following example, three of four norms available are computed.
%% Cell type:code id: tags:
``` python
F.norm(1)
```
%% Cell type:code id: tags:
``` python
F.norm(np.inf)
```
%% Cell type:code id: tags:
``` python
F.norm('fro')
```
%% Cell type:markdown id: tags:
Now, check the values are not far from the Faust's dense matrix.
%% Cell type:code id: tags:
``` python
from numpy.linalg import norm
norm(F.todense(),1)
```
%% Cell type:code id: tags:
``` python
norm(F.todense(), np.inf)
```
%% Cell type:code id: tags:
``` python
norm(F.todense(), 'fro')
```
%% Cell type:markdown id: tags:
Perfect! But a last norm is available, this is the Faust's 2-norm. Let's see in the next small benchmark how the Faust 2-norm is being computed faster than the Faust's dense matrix 2-norm.
%% Cell type:code id: tags:
``` python
timeit -n 10 G.norm(2)
```
%% Cell type:code id: tags:
``` python
timeit -n 10 norm(GD,2) # sorry, it could be slow
```
%% Cell type:markdown id: tags:
The power-iteration algorithm implemented in the FAµST C++ core is faster on G and the relative error is not bad too. The norm computation is faster as it benefits from faster Faust-vector multiplication
%% Cell type:code id: tags:
``` python
err = abs((G.norm(2)-norm(GD,2))/norm(GD,2))
err
```
%% Cell type:markdown id: tags:
### 2.5 Faust Normalizations
%% Cell type:markdown id: tags:
The FAµST API proposes a group of normalizations. They correspond to the norms available and discussed above.
It's possible to normalize along columns or rows with any type of these norms.
**NOTE for Windows users:** Faust.normalize() is currently buggy in only one case: you're using python3 on Windows and you installed pyfaust with a pip pre-compiled package. Sorry for the inconvenience, the bug is on the to-fix list.
%% Cell type:code id: tags:
``` python
F = FF.rand(5,10)
NF = F.normalize()
```
%% Cell type:markdown id: tags:
The API doc is [here](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classpyfaust_1_1Faust.html#ae93af25bb48c768fd0d08e71631e9dac).
%% Cell type:markdown id: tags:
What's interesting here is the fact that ```Faust.normalize``` returns a Faust object. Combined with slicing (that you will see soon), ```normalize``` is useful to write algorithms such as Orthonormal Matching Pursuit (OMP), which require matrices with L2-normalized columns, in a way that makes them able to leverage the acceleration offered by the FAµST API.
The normalization coded in C++ is memory optimized (it never builds the dense matrix ```F.toarray()``` to compute the norms of the columns/rows). In the same goal the factors composing the Faust object NF are not duplicated in memory from same factors F, they're used as is with an additional factor giving the appropriate scaling.
%% Cell type:code id: tags:
``` python
F
```
%% Cell type:code id: tags:
``` python
NF
```
%% Cell type:code id: tags:
``` python
NF.get_factor(5).todense()
```
%% Cell type:code id: tags:
``` python
cumerr = 0
for i in range(0,F.shape[1]):
cumerr += norm(NF.todense()[:,i]-F.todense()[:,i]/norm(F.todense()[:,i]))
cumerr
```
%% Cell type:markdown id: tags:
And as you see it works!
%% Cell type:markdown id: tags:
### 2.6 Faust Concatenation
%% Cell type:markdown id: tags:
You're probably aware of numpy arrays concatenation otherwise look this example.
%% Cell type:code id: tags:
``` python
from numpy.random import rand
from numpy import eye, concatenate
M = rand(5,5)
I = eye(5,5)
concatenate((M,I))
```
%% Cell type:code id: tags:
``` python
# it was vertical concatenation, now let's concatenate horizontally
concatenate((M,I), axis=1)
```
%% Cell type:markdown id: tags:
As you I'm sure you guessed that likewise you can concatenate Faust objects.
%% Cell type:code id: tags:
``` python
F.concatenate(F)
```
%% Cell type:code id: tags:
``` python
C = F.concatenate(F, axis=1)
```
%% Cell type:code id: tags:
``` python
C.todense()-concatenate((F.todense(), F.todense()),axis=1)
```
%% Cell type:markdown id: tags:
The difference of the two concatenations is full of zeros, so of course it works!
As you noticed the Faust concatenation is stable, you give two Fausts and you get a Faust again.
Besides, it's possible to concatenate an arbitrary number of Faust objects.
%% Cell type:code id: tags:
``` python
F.concatenate(F, C, C, F, axis=1)
```
%% Cell type:markdown id: tags:
As an exercise, you can write the factors of the Faust ```F.concatenate(F)```, F being any Faust.
**Hint**: the block-diagonal matrices are around here.
%% Cell type:markdown id: tags:
### 2.7 Faust Indexing and Slicing
%% Cell type:markdown id: tags:
Sometimes you need to access the dense matrix corresponding to a Faust or an element of it (by the way, note that it's costly).
**NOTE for Windows users:** Faust slicing (for more than one item) is currently buggy in only one case: you're using python3 on Windows and you installed pyfaust with a pip pre-compiled package. Sorry for the inconvenience, the bug is on the to-fix list.
Let's access a Faust item:
%% Cell type:code id: tags:
``` python
F[2,3]
```
%% Cell type:markdown id: tags:
Why is it costly? Because it essentially converts the Faust to its dense form (modulo some optimizations) to just access one item.
%% Cell type:code id: tags:
``` python
timeit F[2,3]
```
%% Cell type:code id: tags:
``` python
timeit FD[2,3]
```
%% Cell type:markdown id: tags:
It's totally the same syntax as numpy but much slower so use it with care.
The more advanced slicing operation uses also the same syntax as numpy:
%% Cell type:code id: tags:
``` python
F[2:5, 3:10]
```
%% Cell type:markdown id: tags:
Here again, the result is another Faust. But this is not a full copy, it makes profit of memory views implemented behind in C++. Solely the first and last factors of the sliced Faust are new in memory, the other are just referenced from the initial Faust F. So use it with no worry for a Faust with a lot of factors!
%% Cell type:markdown id: tags:
The numpy's fancy indexing has also been implemented in the FAµST C++ core, let's try it:
%% Cell type:code id: tags:
``` python
FI = F[[1,3,2],:]
Faust.isFaust(FI)
```
%% Cell type:markdown id: tags:
Again, it's a Faust but is it really working? Verify!
%% Cell type:code id: tags:
``` python
(FI.todense()[0] == F.todense()[1]).all() and \
(FI.todense()[1] == F.todense()[3]).all() and \
(FI.todense()[2] == F.todense()[2]).all()
```
%% Cell type:markdown id: tags:
Yes it is!
**NOTE for Windows users:** Faust fancy indexing is currently buggy on Windows platforms. Sorry for the inconvenience, the bug is on the to-fix list.
%% Cell type:markdown id: tags:
-----
%% Cell type:markdown id: tags:
This is the notebook's end, you have now a global view of what the Faust class is able and what kind of high-level algorithms it is ready for. You might be interested to read other notebooks, just go back to the [page](https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/index.html) where you got this one.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment