Find the closest values of an array

Recently, I face a quite simple problem : I have an array A (100,200) containing values I want to interpolate and I have another array I (5000), containing interpolated values. How to efficiently find tthe closest interpolated values of rach elements of A in I ?
That post give me 90% of the answer. It details how to efficiently find the index of a single value v  into an array arr. The one line magic formula is :


idx = (np.abs(arr - v)).argmin()

but here v is a number and arr is a 1 dimensional array. How my problem can fit in that solution ?

By using broadcasting of course !

I must find for each dimensions of my array the one which fits the values of I. So the solution of my problem is :


idx = (np.abs(A - I[:,None,None])).argmin(axis=0)

Hence idx is idx.shape == A.shape, and it contains indexes where I has the closest values of A.

 

Advertisements

sublime text shortcuts in IPython / Jupyter notebook

If you are a daily user of sublime text, you probably feel very frustrating to not have your classical shortcuts into the IPython/Jupyter notebook.

Hopefully the version 4 of Jupyter allows you to retrieve your favorite sublime text keybinding in your browser.

You just have to copy/paste the following line and add it into your ~/.jupyter/custom/custom.js file :

require(["codemirror/keymap/sublime", "notebook/js/cell"],
function(sublime_keymap, cell) {
cell.Cell.options_default.cm_config.keyMap = 'sublime';
}
);

Thats it , now you can launch your notebook and start editing without complains 🙂

If it does not work, you may also try to replace the code above by this one :


require(["codemirror/keymap/sublime", "notebook/js/cell", "base/js/namespace"],
function(sublime_keymap, cell, IPython) {
// setTimeout(function(){ // uncomment line to fake race-condition
cell.Cell.options_default.cm_config.keyMap = 'sublime';
var cells = IPython.notebook.get_cells();
for(var c=0; c< cells.length ; c++){
cells[c].code_mirror.setOption('keyMap', 'sublime');
}

    // }, 1000)// uncomment  line to fake race condition 
} 

);


Sublime Text

Sublime Text is a wonderful code editor. In addition to several powerful features, the main interest of the tool is the possibility to add extensions.

Extensions

See the dedicated post on My favorites Sublime Text extensions

Configuration File

The Sublime text configuration is done through a Json file. Here is some configuration keys:

  • shift tab indent length
&amp;amp;amp;quot;tab_size&amp;amp;amp;quot;: 4
  • unindent with shift tab
&amp;amp;amp;quot;shift_tab_unindent&amp;amp;amp;quot;: true
  • display white spaces
&amp;amp;amp;quot;draw_white_space&amp;amp;amp;quot;: &amp;amp;amp;quot;all&amp;amp;amp;quot;
  • Display rulers
&amp;amp;amp;quot;rulers&amp;amp;amp;quot;:[80,100],

Here is my config file:

{&amp;amp;amp;quot;auto_complete&amp;amp;amp;quot;: false,
&amp;amp;amp;quot;auto_match_enabled&amp;amp;amp;quot;: false,
&amp;amp;amp;quot;color_scheme&amp;amp;amp;quot;: &amp;amp;amp;quot;Packages/User/Monokai (SL).tmTheme&amp;amp;amp;quot;,
&amp;amp;amp;quot;detect_indenation&amp;amp;amp;quot;: false,
&amp;amp;amp;quot;dictionary&amp;amp;amp;quot;: &amp;amp;amp;quot;Packages/Language - English/en_US.dic&amp;amp;amp;quot;,
&amp;amp;amp;quot;draw_white_space&amp;amp;amp;quot;: &amp;amp;amp;quot;all&amp;amp;amp;quot;,
&amp;amp;amp;quot;font_size&amp;amp;amp;quot;: 10,
&amp;amp;amp;quot;ignored_packages&amp;amp;amp;quot;:
[&amp;amp;amp;quot;Vintage&amp;amp;amp;quot;,
],
&amp;amp;amp;quot;index_exclude_patterns&amp;amp;amp;quot;:
[
&amp;amp;amp;quot;*.log&amp;amp;amp;quot;,
],
&amp;amp;amp;quot;rulers&amp;amp;amp;quot;:
[
80,
100
],
&amp;amp;amp;quot;shift_tab_unindent&amp;amp;amp;quot;: true,
&amp;amp;amp;quot;tab_size&amp;amp;amp;quot;: 4,
&amp;amp;amp;quot;translate_tabs_to_spaces&amp;amp;amp;quot;: true
}

Projects

When you’re working to a project, you can add all related file into a sublime text project. To this end:

Go to Project=> Add Folder to Project

Select your project directory and now all your files are available in the side bar ( View -> side bar -> show sidebar or CTRL+K then CTRL+B).

Then your files can be reached by the Goto Anything feature (see next section)

Then you can save you project (Project -> save Project), and use the Project Quick switch feature (CTRL+ALT+P)

Shortcuts

Some very useful shortcuts for Ubuntu:

Code Navigation

  • CTRL+P : Go to Anything (a.k.a. type to open a file from your project)
  • CTRL+R : Go to Function, in a given file, find a class/method
  • CTRL+P+: : Go to Line
  • F5 : go to definition (function, class,….)
  • ALT+- / ALT+SHIFT+- : jump back and Forward (a.k.a. go back and forward in cursor position ). This is a really powerful feature !
  • CTRL+SHIFT+T : re-open last closed tab

Selection

  • selection and CTRL+D : select one by one all occurrences of selection ( press CTRL+K to skip current selection)
  • selections and CTRL+L : Multiple cursor at selections positions
  • selection and ALT+F3 : select all occurrences of the selection

Snippets

Sublime text support snippets and activate them through a trigger key (e.g. hit TAB). Snippets are very easy to configure using the documentation.

You just have to create a file with the extension : .sublime-snippet and put it into the Sublime Text User  directory.

Example : ipdb

Here is a quick look of the features I use the most in Sublime Text. I’ll try to update this article simultaneously to my future discoveries (a.k.a. your suggestions in comments 😉 ).


matplotlib subplot

Usually, if you were a Matlab user, you probably creating multiple subplots with the following code:


>>> from matplotlib.pyplot import *

>>> f=plt.figure()

>>> ax1=f.add_subplot(211)

>>> ax2=f.add_subplot(212)

>>> ax3=f.add_subplot(221)

>>> ax4=f.add_subplot(222)

But Matplotlib, allow a better way to do this :


 >>> from matplotlib.pyplot import *

>>> f,ax = plt.subplots(2,2) # Mind the ‘s’ !

 

Then ax is a numpy array with


>>> np.shape(ax)

(2,2)


Now you can easily plot on the ax of you choice.

Here’s a minimal example:


 >>> import scipy as sp

>>> from matplotlib.pyplot import *

>>> f,ax = plt.subplots(2,2)

>>> a1=sp.rand(2,2)

>>> a2=sp.rand(15,15)

>>> a3=sp.rand(30,30)

>>> ax[0,0].plot(a1[:,0],a1[:,1],’ob’)

>>> ax[1,0].plot(a2[:,0],a2[:,1],’or’)

>>> ax[1,1].plot(a3[:,0],a3[:,1],’ob’)

>>> plt.show()