๐ข NumPy
NumPy (Numerical Python) is a popular Python library used for numerical and mathematical operations, especially when working with large amounts of data.
It provides a powerful data structure called an array.
๐ฆ Installing NumPy
NumPy is not part of Python's Standard Library, so it is usually installed using pip:
pip install numpyThen import it:
import numpy as np๐ข NumPy Array
A NumPy array is similar to a Python list, but is designed for fast numerical operations.
import numpy as np
numbers = np.array([1, 2, 3, 4, 5])
print(numbers) #[1 2 3 4 5]โก Why NumPy?
With a Python list:
numbers = [1, 2, 3]
print(numbers * 2) #[1, 2, 3, 1, 2, 3]But with NumPy:
numbers = np.array([1, 2, 3])
print(numbers * 2) #[2 4 6]NumPy performs the mathematical operation on every element.
๐งฎ Common Uses
NumPy is widely used for:
๐ข Numerical calculations
๐ Data analysis
๐งฎ Mathematical operations
๐ค Machine Learning
๐ Scientific computing
๐ง Working with multidimensional arrays
๐ Summary:
Clause | When it runs | Purpose |
|---|---|---|
| Always | Try code that might raise errors |
| Only if error occurs | Handle specific errors |
| Only if no error | Do something if all is well |
| Always | Do final cleanup (even if error happens) |
<div class="infographic-pynumpy">
<style>
.infographic-pynumpy {
--ink:#1a1a1a; --ink-soft:#5c5c5c; --paper:#fff; --paper-alt:#f0ece4;
--accent:#2563eb; --accent-soft:#e3ebfd; --line:#ddd6c9;
--mono-font:'IBM Plex Mono','SFMono-Regular',Menlo,monospace;
--display-font:'Fraunces',Georgia,serif; --body-font:'Inter',system-ui,sans-serif;
box-sizing:border-box; max-width:720px; margin:0 auto; font-family:var(--body-font); color:var(--ink); background:var(--paper);
}
.infographic-pynumpy[data-theme="dark"] {
--ink:#e8e6e1; --ink-soft:#9a968c; --paper:#121212; --paper-alt:#1e1e26;
--accent:#5b8def; --accent-soft:#202942; --line:#2c313d;
}
.infographic-pynumpy *,.infographic-pynumpy *::before,.infographic-pynumpy *::after{box-sizing:border-box;}
.infographic-pynumpy .np-wrap{padding:0 clamp(1rem,4vw,2rem) 1.5rem;}
.infographic-pynumpy h1{font-family:var(--display-font);font-weight:600;font-size:clamp(1.4rem,5vw,1.9rem);text-align:center;margin:1.5rem 0 0.25rem;letter-spacing:-0.01em;}
.infographic-pynumpy .np-sub{text-align:center;color:var(--ink-soft);font-size:0.85rem;margin:0 0 1.3rem;}
.infographic-pynumpy .section-title{text-align:center;font-family:var(--mono-font);font-size:0.75rem;font-weight:700;text-transform:uppercase;letter-spacing:0.03em;color:var(--ink-soft);margin:1.5rem 0 0.8rem;}
.infographic-pynumpy .code-line{text-align:center;font-family:var(--mono-font);font-size:0.8rem;color:var(--ink-soft);margin-bottom:0.9rem;}
.infographic-pynumpy .code-line strong{color:var(--ink);}
.infographic-pynumpy .op-row{display:flex;justify-content:center;gap:0.4rem;margin-bottom:1rem;flex-wrap:wrap;}
.infographic-pynumpy .op-btn{font:inherit;font-family:var(--mono-font);font-size:0.82rem;font-weight:700;background:var(--paper-alt);border:1.5px solid var(--line);color:var(--ink-soft);padding:0.45rem 0.8rem;cursor:pointer;border-radius:6px;}
.infographic-pynumpy .op-btn.is-selected{border-color:var(--accent);color:var(--accent);background:var(--accent-soft);}
.infographic-pynumpy .arr-row{display:flex;flex-wrap:wrap;justify-content:center;gap:0.4rem;margin-bottom:0.6rem;}
.infographic-pynumpy .arr-box{font-family:var(--mono-font);font-size:0.85rem;font-weight:700;padding:0.5rem 0.7rem;border-radius:6px;border:1.5px solid var(--line);background:var(--paper-alt);color:var(--ink);min-width:44px;text-align:center;transition:background .3s,border-color .3s,color .3s,transform .2s;}
.infographic-pynumpy .arr-box.out{border-color:var(--accent);background:var(--accent-soft);color:var(--accent);}
.infographic-pynumpy .arr-box.is-flash{animation:np-flash .5s ease;}
@keyframes np-flash{0%{transform:scale(1.15);}100%{transform:scale(1);}}
.infographic-pynumpy .arr-label{text-align:center;font-family:var(--mono-font);font-size:0.68rem;color:var(--ink-soft);margin-bottom:0.3rem;}
.infographic-pynumpy .vs-note{text-align:center;font-size:0.8rem;color:var(--ink-soft);margin-bottom:1.5rem;}
.infographic-pynumpy .grid-2d{display:inline-grid;gap:0.3rem;margin:0 auto 0.8rem;}
.infographic-pynumpy .grid-wrap{display:flex;justify-content:center;margin-bottom:0.6rem;}
.infographic-pynumpy .cell{width:42px;height:36px;display:flex;align-items:center;justify-content:center;font-family:var(--mono-font);font-size:0.78rem;font-weight:700;border-radius:5px;border:1.5px solid var(--line);background:var(--paper-alt);color:var(--ink);transition:background .25s,border-color .25s,color .25s;}
.infographic-pynumpy .cell.hl{border-color:var(--accent);background:var(--accent-soft);color:var(--accent);}
.infographic-pynumpy .idx-row{display:flex;justify-content:center;gap:0.4rem;margin-bottom:0.8rem;flex-wrap:wrap;}
.infographic-pynumpy .idx-btn{font:inherit;font-family:var(--mono-font);font-size:0.76rem;font-weight:700;background:var(--paper-alt);border:1.5px solid var(--line);color:var(--ink);padding:0.35rem 0.6rem;cursor:pointer;border-radius:6px;}
.infographic-pynumpy .idx-btn.is-selected{border-color:var(--accent);color:var(--accent);background:var(--accent-soft);}
.infographic-pynumpy .result-line{text-align:center;font-family:var(--mono-font);font-size:0.88rem;font-weight:700;color:var(--accent);margin-bottom:1.4rem;min-height:1.3em;}
@media (prefers-reduced-motion:reduce){.infographic-pynumpy *,.infographic-pynumpy *::before,.infographic-pynumpy *::after{animation-duration:.001ms!important;transition-duration:.001ms!important;}}
</style>
<div class="np-wrap">
<h1>NumPy</h1>
<p class="np-sub">Arrays that apply one operation to every element at once โ no loop required.</p>
<div class="section-title">Vectorized Operations</div>
<div class="code-line">arr = np.array([1, 2, 3, 4, 5]) ยท result = <strong id="opCodeLabel">arr * 2</strong></div>
<div class="op-row">
<button class="op-btn is-selected" data-op="mul2">arr * 2</button>
<button class="op-btn" data-op="add5">arr + 5</button>
<button class="op-btn" data-op="sq">arr ** 2</button>
<button class="op-btn" data-op="gt2">arr > 2</button>
</div>
<div class="arr-label">arr</div>
<div class="arr-row" id="npInputRow"></div>
<div class="arr-label">result</div>
<div class="arr-row" id="npOutputRow"></div>
<p class="vs-note">A plain Python list would need <strong style="font-family:var(--mono-font); color:var(--ink);">[x * 2 for x in arr]</strong> โ NumPy just does <strong style="font-family:var(--mono-font); color:var(--ink);">arr * 2</strong>.</p>
<div class="section-title">Reshape & Indexing</div>
<div class="code-line">grid = np.arange(1, 13).reshape(3, 4)</div>
<div class="grid-wrap"><div class="grid-2d" id="gridWrap"></div></div>
<div class="idx-row">
<button class="idx-btn is-selected" data-i="row1">grid[1]</button>
<button class="idx-btn" data-i="col2">grid[:, 2]</button>
<button class="idx-btn" data-i="cell">grid[1, 2]</button>
<button class="idx-btn" data-i="slice">grid[0:2, 1:3]</button>
</div>
<p class="result-line" id="gridResult">โ [5, 6, 7, 8]</p>
</div>
<script>
(function(){
var root = document.currentScript.closest('.infographic-pynumpy') || document.querySelector('.infographic-pynumpy');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark = bodyAttr === 'true' ? true : bodyAttr === 'false' ? false : (document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/) || [])[1] === 'true';
if (dark) root.setAttribute('data-theme', 'dark');
var arr = [1, 2, 3, 4, 5];
var npInputRow = root.querySelector('#npInputRow');
var npOutputRow = root.querySelector('#npOutputRow');
var opCodeLabel = root.querySelector('#opCodeLabel');
var currentOp = 'mul2';
var opLabels = { mul2: 'arr * 2', add5: 'arr + 5', sq: 'arr ** 2', gt2: 'arr > 2' };
var opFns = {
mul2: function(x){ return x * 2; },
add5: function(x){ return x + 5; },
sq: function(x){ return x * x; },
gt2: function(x){ return x > 2 ? 'True' : 'False'; }
};
function renderNp(){
npInputRow.innerHTML = '';
npOutputRow.innerHTML = '';
arr.forEach(function(v){
var b1 = document.createElement('div'); b1.className = 'arr-box'; b1.textContent = v; npInputRow.appendChild(b1);
var b2 = document.createElement('div'); b2.className = 'arr-box out is-flash'; b2.textContent = opFns[currentOp](v); npOutputRow.appendChild(b2);
});
}
root.querySelectorAll('.op-row .op-btn').forEach(function(btn){
btn.addEventListener('click', function(){
root.querySelectorAll('.op-row .op-btn').forEach(function(b){ b.classList.remove('is-selected'); });
btn.classList.add('is-selected');
currentOp = btn.dataset.op;
opCodeLabel.textContent = opLabels[currentOp];
renderNp();
});
});
renderNp();
/* grid */
var gridData = [];
for (var r = 0; r < 3; r++) { var row = []; for (var c = 0; c < 4; c++) row.push(r*4+c+1); gridData.push(row); }
var gridWrap = root.querySelector('#gridWrap');
gridWrap.style.gridTemplateColumns = 'repeat(4, 42px)';
var cells = [];
for (var r2 = 0; r2 < 3; r2++) {
cells.push([]);
for (var c2 = 0; c2 < 4; c2++) {
var cell = document.createElement('div');
cell.className = 'cell';
cell.textContent = gridData[r2][c2];
gridWrap.appendChild(cell);
cells[r2].push(cell);
}
}
var gridResult = root.querySelector('#gridResult');
function clearGridHl(){ cells.forEach(function(row){ row.forEach(function(c){ c.classList.remove('hl'); }); }); }
function applyIdx(key){
clearGridHl();
if (key === 'row1') {
cells[1].forEach(function(c){ c.classList.add('hl'); });
gridResult.textContent = 'โ [' + gridData[1].join(', ') + ']';
} else if (key === 'col2') {
for (var r=0;r<3;r++) cells[r][2].classList.add('hl');
gridResult.textContent = 'โ [' + gridData.map(function(row){return row[2];}).join(', ') + ']';
} else if (key === 'cell') {
cells[1][2].classList.add('hl');
gridResult.textContent = 'โ ' + gridData[1][2];
} else if (key === 'slice') {
for (var r3=0;r3<2;r3++) for (var c3=1;c3<3;c3++) cells[r3][c3].classList.add('hl');
gridResult.textContent = 'โ [[' + gridData[0].slice(1,3).join(', ') + '], [' + gridData[1].slice(1,3).join(', ') + ']]';
}
}
root.querySelectorAll('.idx-row .idx-btn').forEach(function(btn){
btn.addEventListener('click', function(){
root.querySelectorAll('.idx-row .idx-btn').forEach(function(b){ b.classList.remove('is-selected'); });
btn.classList.add('is-selected');
applyIdx(btn.dataset.i);
});
});
applyIdx('row1');
})();
</script>
</div>