Upload numpy/NUMPY_USER_GUIDE.txt with huggingface_hub
Browse files- numpy/NUMPY_USER_GUIDE.txt +534 -0
numpy/NUMPY_USER_GUIDE.txt
ADDED
|
@@ -0,0 +1,534 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
================================================================================
|
| 2 |
+
NUMPY - USER GUIDE (Android Python STB)
|
| 3 |
+
Generated by RIMI
|
| 4 |
+
================================================================================
|
| 5 |
+
Covers: what numpy is, install/verify, arrays, dtypes, math, indexing,
|
| 6 |
+
reshaping, linear algebra, random, file I/O, numpy + Pillow,
|
| 7 |
+
printing in the terminal, and common pitfalls.
|
| 8 |
+
|
| 9 |
+
Written for: Python 3.12.2 (RIMI build) on Android
|
| 10 |
+
Version: numpy 2.5.2
|
| 11 |
+
Scripts dir: /storage/emulated/0/PythonSTB/Scripts/
|
| 12 |
+
Installed: /data/user/0/com.pythonstb.rimi/files/python/lib/python3.12/site-packages/
|
| 13 |
+
================================================================================
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
--------------------------------------------------------------------------------
|
| 17 |
+
1) WHAT IS NUMPY?
|
| 18 |
+
--------------------------------------------------------------------------------
|
| 19 |
+
|
| 20 |
+
NumPy is the fundamental library for fast numerical computing in Python.
|
| 21 |
+
It adds:
|
| 22 |
+
- n-dimensional arrays (ndarray) - faster and more compact than Python lists
|
| 23 |
+
- element-wise math without writing loops
|
| 24 |
+
- linear algebra (matrix multiply, inverse, solve, eig, ...)
|
| 25 |
+
- random numbers, FFT, sorting, statistics
|
| 26 |
+
- a bridge to C/Python extensions (OpenCV, Pillow, pandas, scipy, ...)
|
| 27 |
+
|
| 28 |
+
Typical speedup vs plain Python loops: 10x - 100x or more.
|
| 29 |
+
|
| 30 |
+
This Android build of numpy is compiled with OpenBLAS, so matrix operations
|
| 31 |
+
are optimized (BLAS/LAPACK) on both arm64 and x86_64.
|
| 32 |
+
|
| 33 |
+
import numpy as np
|
| 34 |
+
print(np.__version__) # 2.5.2
|
| 35 |
+
print(np.show_config()) # shows BLAS/LAPACK backend + build info
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
--------------------------------------------------------------------------------
|
| 39 |
+
2) INSTALL / VERIFY
|
| 40 |
+
--------------------------------------------------------------------------------
|
| 41 |
+
|
| 42 |
+
Install (already done, but if you ever reinstall):
|
| 43 |
+
pip install numpy # or install the wheel file directly
|
| 44 |
+
|
| 45 |
+
Quick smoke test - run in your app:
|
| 46 |
+
import numpy as np
|
| 47 |
+
a = np.arange(12).reshape(3, 4)
|
| 48 |
+
print(a)
|
| 49 |
+
print("sum:", a.sum(), "max:", a.max(), "shape:", a.shape, "dtype:", a.dtype)
|
| 50 |
+
print("blas:", np.__config__.show("build") if hasattr(np.__config__, "show") else "n/a")
|
| 51 |
+
|
| 52 |
+
Expected output pattern:
|
| 53 |
+
[[ 0 1 2 3]
|
| 54 |
+
[ 4 5 6 7]
|
| 55 |
+
[ 8 9 10 11]]
|
| 56 |
+
sum: 66 max: 11 shape: (3, 4) dtype: int64
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
--------------------------------------------------------------------------------
|
| 60 |
+
3) ARRAYS - CREATION BASICS
|
| 61 |
+
--------------------------------------------------------------------------------
|
| 62 |
+
|
| 63 |
+
import numpy as np
|
| 64 |
+
|
| 65 |
+
# from a list
|
| 66 |
+
a = np.array([1, 2, 3]) # 1-D, dtype int64
|
| 67 |
+
b = np.array([[1, 2, 3], [4, 5, 6]]) # 2-D shape (2, 3)
|
| 68 |
+
c = np.array([1.0, 2.0, 3.0]) # float64
|
| 69 |
+
|
| 70 |
+
# zeros / ones / full / identity
|
| 71 |
+
np.zeros((3, 4))
|
| 72 |
+
np.ones((2, 2))
|
| 73 |
+
np.full((2, 3), 7.5)
|
| 74 |
+
np.eye(4) # 4x4 identity
|
| 75 |
+
np.identity(3)
|
| 76 |
+
|
| 77 |
+
# ranges
|
| 78 |
+
np.arange(10) # 0..9
|
| 79 |
+
np.arange(0, 1, 0.1) # 0.0, 0.1, ... 0.9
|
| 80 |
+
np.linspace(0, 1, 5) # 5 evenly spaced points 0..1
|
| 81 |
+
np.logspace(1, 3, 3) # 10, 100, 1000
|
| 82 |
+
|
| 83 |
+
# random
|
| 84 |
+
rng = np.random.default_rng(seed=42) # reproducible
|
| 85 |
+
rng.random((3, 3)) # uniform [0,1)
|
| 86 |
+
rng.integers(0, 10, size=(2, 5)) # integers 0..9
|
| 87 |
+
rng.normal(0, 1, size=(4,)) # normal dist
|
| 88 |
+
rng.permutation(10) # shuffled 0..9
|
| 89 |
+
|
| 90 |
+
# important attributes
|
| 91 |
+
a = np.array([[1, 2, 3], [4, 5, 6]])
|
| 92 |
+
a.shape # (2, 3)
|
| 93 |
+
a.ndim # 2
|
| 94 |
+
a.size # 6
|
| 95 |
+
a.dtype # dtype('int64')
|
| 96 |
+
a.itemsize # bytes per element
|
| 97 |
+
a.nbytes # total bytes
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
--------------------------------------------------------------------------------
|
| 101 |
+
4) DTYPES (data types)
|
| 102 |
+
--------------------------------------------------------------------------------
|
| 103 |
+
|
| 104 |
+
np.int8 np.int16 np.int32 np.int64 # signed integers
|
| 105 |
+
np.uint8 np.uint16 np.uint32 np.uint64 # unsigned integers
|
| 106 |
+
np.float32 np.float64 # floats (f32 is half memory)
|
| 107 |
+
np.complex64 np.complex128 # complex
|
| 108 |
+
np.bool_ # boolean
|
| 109 |
+
np.str_ np.bytes_ # strings (avoid for math)
|
| 110 |
+
'f4','f8','i1','i2','i4','i8','u1','u2','u4','u8' # short aliases
|
| 111 |
+
|
| 112 |
+
a = np.array([1, 2, 3], dtype=np.uint8)
|
| 113 |
+
b = a.astype(np.float32) # convert
|
| 114 |
+
c = a.astype('f4')
|
| 115 |
+
|
| 116 |
+
Rules of thumb:
|
| 117 |
+
- use np.float64 (default) for general math
|
| 118 |
+
- use np.float32 or np.uint8 for big arrays / images (half the memory)
|
| 119 |
+
- beware overflow: np.array([200], np.uint8) + 100 wraps to 44
|
| 120 |
+
- beware int division: np.array([5]) // 2 == 2 (floor), np.array([5]) / 2 == 2.5
|
| 121 |
+
|
| 122 |
+
|
| 123 |
+
--------------------------------------------------------------------------------
|
| 124 |
+
5) INDEXING AND SLICING
|
| 125 |
+
--------------------------------------------------------------------------------
|
| 126 |
+
|
| 127 |
+
a = np.arange(12).reshape(3, 4)
|
| 128 |
+
# [[ 0 1 2 3]
|
| 129 |
+
# [ 4 5 6 7]
|
| 130 |
+
# [ 8 9 10 11]]
|
| 131 |
+
|
| 132 |
+
a[0] # row 0: [0 1 2 3]
|
| 133 |
+
a[0, 2] # scalar 2
|
| 134 |
+
a[:, 1] # column 1: [1 5 9]
|
| 135 |
+
a[1:, :2] # rows 1..2, cols 0..1
|
| 136 |
+
a[-1] # last row
|
| 137 |
+
a[::2] # every other row
|
| 138 |
+
|
| 139 |
+
# boolean masking
|
| 140 |
+
a[a > 5] # 1-D array of values > 5
|
| 141 |
+
a[(a > 2) & (a < 8)] # combine masks with & |
|
| 142 |
+
a[a % 2 == 0] # even values
|
| 143 |
+
|
| 144 |
+
# fancy indexing with arrays
|
| 145 |
+
a[[0, 2]] # rows 0 and 2
|
| 146 |
+
idx = np.array([3, 1])
|
| 147 |
+
a[:, idx] # columns 3 and 1
|
| 148 |
+
|
| 149 |
+
# assignment with masks
|
| 150 |
+
a[a < 5] = 0 # zero out everything below 5
|
| 151 |
+
a[:, 0] = -1 # set first column
|
| 152 |
+
|
| 153 |
+
|
| 154 |
+
--------------------------------------------------------------------------------
|
| 155 |
+
6) SHAPES - RESHAPE / FLATTEN / TRANSPOSE / BROADCAST
|
| 156 |
+
--------------------------------------------------------------------------------
|
| 157 |
+
|
| 158 |
+
a = np.arange(24)
|
| 159 |
+
|
| 160 |
+
a.reshape(4, 6) # same data, new shape
|
| 161 |
+
a.reshape(2, 3, 4) # 3-D
|
| 162 |
+
a.reshape(-1, 6) # -1 = auto: (4, 6)
|
| 163 |
+
a.ravel() # flatten to 1-D (may copy)
|
| 164 |
+
a.flatten() # always a copy, 1-D
|
| 165 |
+
a.T # transpose
|
| 166 |
+
a.reshape(4, 6).T.shape # (6, 4)
|
| 167 |
+
|
| 168 |
+
# add a new axis
|
| 169 |
+
v = np.array([1, 2, 3])
|
| 170 |
+
v[np.newaxis, :].shape # (1, 3)
|
| 171 |
+
v[:, np.newaxis].shape # (3, 1)
|
| 172 |
+
|
| 173 |
+
# BROADCASTING: shapes line up from the right
|
| 174 |
+
m = np.ones((3, 4))
|
| 175 |
+
m + 1 # scalar broadcast
|
| 176 |
+
m * np.array([10, 20, 30, 40]) # row vector broadcast over rows
|
| 177 |
+
m + np.array([[1], [2], [3]]) # column vector broadcast over cols
|
| 178 |
+
# rule: dimensions must be equal or one of them must be 1
|
| 179 |
+
|
| 180 |
+
|
| 181 |
+
--------------------------------------------------------------------------------
|
| 182 |
+
7) MATH - ELEMENT-WISE AND REDUCTIONS
|
| 183 |
+
--------------------------------------------------------------------------------
|
| 184 |
+
|
| 185 |
+
a = np.array([1., 2., 3., 4.])
|
| 186 |
+
|
| 187 |
+
a + 1, a - 1, a * 2, a / 2, a ** 2, -a # element-wise
|
| 188 |
+
np.sqrt(a), np.abs(a), np.exp(a), np.log(a)
|
| 189 |
+
np.sin(a), np.cos(a), np.tan(a), np.arctan(a)
|
| 190 |
+
np.round(a), np.floor(a), np.ceil(a), np.clip(a, 1.5, 3.5)
|
| 191 |
+
np.sign(a), np.mod(a, 2), np.power(a, 3)
|
| 192 |
+
np.maximum(a, 2), np.minimum(a, 3)
|
| 193 |
+
|
| 194 |
+
# reductions (default: over all elements)
|
| 195 |
+
a.sum() a.mean() a.min() a.max() a.std() a.var()
|
| 196 |
+
a.prod() a.argmax() a.argmin() a.cumsum() a.cumprod()
|
| 197 |
+
np.median(a) np.percentile(a, 50) np.ptp(a) # peak-to-peak
|
| 198 |
+
|
| 199 |
+
# along an axis
|
| 200 |
+
m = np.arange(6).reshape(2, 3)
|
| 201 |
+
m.sum(axis=0) # per column: [3 5 7]
|
| 202 |
+
m.sum(axis=1) # per row: [3 12]
|
| 203 |
+
m.max(axis=0), m.min(axis=1)
|
| 204 |
+
|
| 205 |
+
# comparisons return boolean arrays
|
| 206 |
+
(a > 2) # array([False, False, True, True])
|
| 207 |
+
np.any(a > 2) # True
|
| 208 |
+
np.all(a > 2) # False
|
| 209 |
+
np.count_nonzero(a > 2) # 2
|
| 210 |
+
|
| 211 |
+
|
| 212 |
+
--------------------------------------------------------------------------------
|
| 213 |
+
8) LINEAR ALGEBRA (OpenBLAS accelerated)
|
| 214 |
+
--------------------------------------------------------------------------------
|
| 215 |
+
|
| 216 |
+
a = np.array([[1., 2.], [3., 4.]])
|
| 217 |
+
b = np.array([[5., 6.], [7., 8.]])
|
| 218 |
+
|
| 219 |
+
a @ b # matrix multiply (preferred)
|
| 220 |
+
np.matmul(a, b) # same
|
| 221 |
+
a.dot(b) # same (older style)
|
| 222 |
+
a * b # ELEMENT-WISE, NOT matrix multiply
|
| 223 |
+
|
| 224 |
+
np.linalg.inv(a) # inverse
|
| 225 |
+
np.linalg.det(a) # determinant
|
| 226 |
+
np.linalg.solve(a, np.array([1., 2.])) # solve a x = b
|
| 227 |
+
np.linalg.eig(a) # eigenvalues + eigenvectors
|
| 228 |
+
np.linalg.norm(a) # Frobenius norm
|
| 229 |
+
np.linalg.qr(a), np.linalg.svd(a)
|
| 230 |
+
np.linalg.pinv(a) # pseudo-inverse
|
| 231 |
+
np.linalg.matrix_power(a, 3)
|
| 232 |
+
|
| 233 |
+
# vector ops
|
| 234 |
+
v = np.array([1., 2., 3.])
|
| 235 |
+
w = np.array([4., 5., 6.])
|
| 236 |
+
np.dot(v, w) # dot product 32.0
|
| 237 |
+
np.cross(v, w) # cross product
|
| 238 |
+
np.inner(v, w) # inner product
|
| 239 |
+
|
| 240 |
+
# useful on the device: transform a 3D point / homography
|
| 241 |
+
M = np.array([[1., 0., 10.], [0., 1., 20.], [0., 0., 1.]])
|
| 242 |
+
p = np.array([5., 6., 1.])
|
| 243 |
+
out = M @ p
|
| 244 |
+
|
| 245 |
+
|
| 246 |
+
--------------------------------------------------------------------------------
|
| 247 |
+
9) STACKING, SPLITTING, CONCATENATING
|
| 248 |
+
--------------------------------------------------------------------------------
|
| 249 |
+
|
| 250 |
+
a = np.array([1, 2, 3])
|
| 251 |
+
b = np.array([4, 5, 6])
|
| 252 |
+
|
| 253 |
+
np.concatenate((a, b)) # [1 2 3 4 5 6]
|
| 254 |
+
np.stack((a, b)) # shape (2, 3)
|
| 255 |
+
np.vstack((a, b)) # vertical: shape (2, 3)
|
| 256 |
+
np.hstack((a, b)) # horizontal: [1 2 3 4 5 6]
|
| 257 |
+
np.dstack((a, b)) # depth: shape (1, 3, 2)
|
| 258 |
+
|
| 259 |
+
m1 = np.ones((2, 2))
|
| 260 |
+
m2 = np.zeros((2, 2))
|
| 261 |
+
np.vstack((m1, m2)) # (4, 2)
|
| 262 |
+
np.hstack((m1, m2)) # (2, 4)
|
| 263 |
+
|
| 264 |
+
# split
|
| 265 |
+
x = np.arange(10)
|
| 266 |
+
np.split(x, 2) # two arrays of 5
|
| 267 |
+
np.array_split(x, 3) # uneven split
|
| 268 |
+
np.hsplit(m1, 2), np.vsplit(m1, 2)
|
| 269 |
+
|
| 270 |
+
|
| 271 |
+
--------------------------------------------------------------------------------
|
| 272 |
+
10) RANDOM NUMBERS
|
| 273 |
+
--------------------------------------------------------------------------------
|
| 274 |
+
|
| 275 |
+
rng = np.random.default_rng(2026) # always seed for reproducibility
|
| 276 |
+
rng.random((2, 3)) # [0,1) floats
|
| 277 |
+
rng.integers(1, 7, size=10) # die rolls 1..6
|
| 278 |
+
rng.normal(loc=0, scale=1, size=(3, 3))
|
| 279 |
+
rng.uniform(0, 10, size=5)
|
| 280 |
+
rng.choice(np.arange(5), size=10, replace=True)
|
| 281 |
+
rng.shuffle(np.arange(10)) # in place
|
| 282 |
+
rng.standard_normal((4,))
|
| 283 |
+
|
| 284 |
+
# old style (np.random.rand etc.) also works, but default_rng is preferred.
|
| 285 |
+
|
| 286 |
+
|
| 287 |
+
--------------------------------------------------------------------------------
|
| 288 |
+
11) SAVE / LOAD DATA (files)
|
| 289 |
+
--------------------------------------------------------------------------------
|
| 290 |
+
|
| 291 |
+
a = np.arange(12).reshape(3, 4)
|
| 292 |
+
|
| 293 |
+
# numpy binary format (fast, compact, one array per file)
|
| 294 |
+
np.save("/storage/emulated/0/Download/a.npy", a)
|
| 295 |
+
b = np.load("/storage/emulated/0/Download/a.npy")
|
| 296 |
+
|
| 297 |
+
# compressed multi-array archive
|
| 298 |
+
np.savez("/storage/emulated/0/Download/data.npz", x=a, y=a * 2)
|
| 299 |
+
d = np.load("/storage/emulated/0/Download/data.npz")
|
| 300 |
+
d["x"], d["y"]
|
| 301 |
+
# or np.savez_compressed(...) for smaller files
|
| 302 |
+
|
| 303 |
+
# text (human readable)
|
| 304 |
+
np.savetxt("/storage/emulated/0/Download/a.csv", a, delimiter=",")
|
| 305 |
+
c = np.loadtxt("/storage/emulated/0/Download/a.csv", delimiter=",")
|
| 306 |
+
# note: loadtxt returns float64; use dtype= to control
|
| 307 |
+
np.savetxt("/storage/emulated/0/Download/a.tsv", a, delimiter="\t",
|
| 308 |
+
fmt="%.2f")
|
| 309 |
+
|
| 310 |
+
# plain binary (raw, no header)
|
| 311 |
+
a.tofile("/storage/emulated/0/Download/a.bin")
|
| 312 |
+
np.fromfile("/storage/emulated/0/Download/a.bin", dtype=np.int64)
|
| 313 |
+
|
| 314 |
+
|
| 315 |
+
--------------------------------------------------------------------------------
|
| 316 |
+
12) NUMPY + PILLOW (images are just arrays)
|
| 317 |
+
--------------------------------------------------------------------------------
|
| 318 |
+
|
| 319 |
+
from PIL import Image
|
| 320 |
+
import numpy as np
|
| 321 |
+
|
| 322 |
+
# PIL image -> numpy array (H, W, C)
|
| 323 |
+
im = Image.open("/storage/emulated/0/Download/photo.jpg").convert("RGB")
|
| 324 |
+
arr = np.asarray(im)
|
| 325 |
+
print(arr.shape) # (height, width, 3)
|
| 326 |
+
print(arr.dtype) # uint8
|
| 327 |
+
|
| 328 |
+
# numpy array -> PIL image
|
| 329 |
+
img2 = Image.fromarray(arr)
|
| 330 |
+
img2.save("/storage/emulated/0/Download/out.jpg", quality=95)
|
| 331 |
+
|
| 332 |
+
# grayscale -> (H, W)
|
| 333 |
+
gray = np.asarray(im.convert("L"))
|
| 334 |
+
# alpha -> (H, W, 4)
|
| 335 |
+
rgba = np.asarray(im.convert("RGBA"))
|
| 336 |
+
|
| 337 |
+
# process with numpy, then convert back
|
| 338 |
+
arr2 = arr[:, ::-1] # mirror
|
| 339 |
+
arr3 = np.clip(arr.astype(np.int16) + 50, 0, 255).astype(np.uint8) # brighten
|
| 340 |
+
arr4 = 255 - arr # invert
|
| 341 |
+
arr5 = arr.copy(); arr5[..., 0] = 255 # force red channel to max
|
| 342 |
+
Image.fromarray(arr2).save("/storage/emulated/0/Download/mirror.png")
|
| 343 |
+
Image.fromarray(arr4).save("/storage/emulated/0/Download/invert.png")
|
| 344 |
+
|
| 345 |
+
# crop = slice
|
| 346 |
+
crop = arr[100:200, 50:150]
|
| 347 |
+
Image.fromarray(crop).save("/storage/emulated/0/Download/crop.png")
|
| 348 |
+
|
| 349 |
+
# resize with numpy (nearest) - better to use PIL resize normally
|
| 350 |
+
small = arr[::4, ::4] # nearest-neighbour downsample
|
| 351 |
+
|
| 352 |
+
# build a gradient image
|
| 353 |
+
h, w = 200, 200
|
| 354 |
+
yy, xx = np.mgrid[0:h, 0:w]
|
| 355 |
+
grad = np.stack([
|
| 356 |
+
(xx * 255 // max(1, w - 1)).astype(np.uint8),
|
| 357 |
+
(yy * 255 // max(1, h - 1)).astype(np.uint8),
|
| 358 |
+
((xx + yy) * 255 // max(1, (w + h) - 2)).astype(np.uint8),
|
| 359 |
+
], axis=2)
|
| 360 |
+
Image.fromarray(grad).save("/storage/emulated/0/Download/gradient.png")
|
| 361 |
+
|
| 362 |
+
IMPORTANT:
|
| 363 |
+
np.asarray(im) may share memory with the PIL image. If you modify arr
|
| 364 |
+
in place (arr[...] = ...), the image changes too. Use arr.copy() when
|
| 365 |
+
you need an independent buffer.
|
| 366 |
+
uint8 arithmetic overflows (255+1 -> 0). Cast to int16 first for math:
|
| 367 |
+
arr.astype(np.int16).
|
| 368 |
+
|
| 369 |
+
|
| 370 |
+
--------------------------------------------------------------------------------
|
| 371 |
+
13) PRINTING ARRAYS / MATRICES IN THE TERMINAL
|
| 372 |
+
--------------------------------------------------------------------------------
|
| 373 |
+
|
| 374 |
+
a = np.arange(12).reshape(3, 4)
|
| 375 |
+
|
| 376 |
+
print(a) # default pretty print
|
| 377 |
+
print(a.tolist()) # as nested Python lists
|
| 378 |
+
|
| 379 |
+
# control the output
|
| 380 |
+
import numpy as np
|
| 381 |
+
np.set_printoptions(
|
| 382 |
+
precision=2, # decimals for floats
|
| 383 |
+
threshold=20, # max elements before "..."
|
| 384 |
+
edgeitems=3,
|
| 385 |
+
linewidth=120,
|
| 386 |
+
suppress=True, # avoid scientific notation for small numbers
|
| 387 |
+
formatter={"float_kind": lambda v: f"{v:7.2f}"},
|
| 388 |
+
)
|
| 389 |
+
print(a)
|
| 390 |
+
|
| 391 |
+
# a small helper to show an array as a grid of numbers
|
| 392 |
+
def print_matrix(m):
|
| 393 |
+
m = np.asarray(m)
|
| 394 |
+
for row in m:
|
| 395 |
+
print(" ".join(f"{v:8.3f}" for v in row))
|
| 396 |
+
|
| 397 |
+
print_matrix(np.random.default_rng(1).random((3, 5)))
|
| 398 |
+
|
| 399 |
+
# print a 2D array as colored blocks (with ANSI)
|
| 400 |
+
def print_heatmap(m, cols=40):
|
| 401 |
+
m = np.asarray(m, dtype=np.float64)
|
| 402 |
+
if m.ndim != 2:
|
| 403 |
+
m = m.reshape(m.shape[0], -1)
|
| 404 |
+
h, w = m.shape
|
| 405 |
+
# resample columns to terminal width (nearest)
|
| 406 |
+
if w > cols:
|
| 407 |
+
m = m[:, ::max(1, w // cols)][:, :cols]
|
| 408 |
+
h, w = m.shape
|
| 409 |
+
lo, hi = m.min(), m.max()
|
| 410 |
+
rng = (hi - lo) or 1.0
|
| 411 |
+
out = []
|
| 412 |
+
for row in m:
|
| 413 |
+
line = ""
|
| 414 |
+
for v in row:
|
| 415 |
+
t = (v - lo) / rng # 0..1
|
| 416 |
+
r = int(255 * t)
|
| 417 |
+
g = int(255 * (1 - t))
|
| 418 |
+
line += f"\x1b[48;2;{r};{g};0m "
|
| 419 |
+
out.append(line + "\x1b[0m")
|
| 420 |
+
print("\n".join(out))
|
| 421 |
+
|
| 422 |
+
# example: heatmap of a sinc function
|
| 423 |
+
import numpy as np
|
| 424 |
+
x = np.linspace(-6, 6, 80)
|
| 425 |
+
y = np.linspace(-6, 6, 40)
|
| 426 |
+
yy, xx = np.meshgrid(y, x, indexing="ij")
|
| 427 |
+
z = np.sinc(np.sqrt(xx ** 2 + yy ** 2))
|
| 428 |
+
print_heatmap(z, cols=60)
|
| 429 |
+
|
| 430 |
+
# ASCII density plot from a 2D array
|
| 431 |
+
RAMP = " .:-=+*#%@"
|
| 432 |
+
def print_ascii_grid(m, cols=60):
|
| 433 |
+
m = np.asarray(m, dtype=np.float64)
|
| 434 |
+
if w := m.shape[1] > cols:
|
| 435 |
+
m = m[:, ::w // cols + 1]
|
| 436 |
+
lo, hi = m.min(), m.max()
|
| 437 |
+
rng = (hi - lo) or 1.0
|
| 438 |
+
for row in m:
|
| 439 |
+
print("".join(RAMP[int((v - lo) / rng * (len(RAMP) - 1))] for v in row))
|
| 440 |
+
|
| 441 |
+
print_ascii_grid(z, cols=70)
|
| 442 |
+
|
| 443 |
+
|
| 444 |
+
--------------------------------------------------------------------------------
|
| 445 |
+
14) USEFUL EVERYDAY SNIPPETS
|
| 446 |
+
--------------------------------------------------------------------------------
|
| 447 |
+
|
| 448 |
+
Statistics of a numeric column:
|
| 449 |
+
data = np.array([1., 2., 3., 4., 100.])
|
| 450 |
+
print("mean %.2f std %.2f median %.2f min %.0f max %.0f" % (
|
| 451 |
+
data.mean(), data.std(), np.median(data), data.min(), data.max()))
|
| 452 |
+
|
| 453 |
+
Normalize to [0, 1]:
|
| 454 |
+
x = np.array([3., 1., 2., 0.])
|
| 455 |
+
n = (x - x.min()) / (x.max() - x.min())
|
| 456 |
+
|
| 457 |
+
Standard score (z-score):
|
| 458 |
+
z = (x - x.mean()) / x.std()
|
| 459 |
+
|
| 460 |
+
One-hot encode categories:
|
| 461 |
+
cats = np.array([0, 2, 1, 2, 0])
|
| 462 |
+
onehot = np.eye(3)[cats]
|
| 463 |
+
|
| 464 |
+
Extract the diagonal of a matrix:
|
| 465 |
+
np.diag(np.arange(9).reshape(3, 3)) # [0 4 8]
|
| 466 |
+
|
| 467 |
+
Histogram:
|
| 468 |
+
values, edges = np.histogram(rng.normal(size=1000), bins=20)
|
| 469 |
+
|
| 470 |
+
Find the index of the maximum in each row:
|
| 471 |
+
m = rng.random((5, 8))
|
| 472 |
+
m.argmax(axis=1)
|
| 473 |
+
|
| 474 |
+
Clip and cast for image math:
|
| 475 |
+
arr.astype(np.float32) * 1.2 + 10 -> clip -> uint8
|
| 476 |
+
|
| 477 |
+
Simple FIR smoothing:
|
| 478 |
+
kernel = np.ones(5) / 5
|
| 479 |
+
smooth = np.convolve(signal, kernel, mode="same")
|
| 480 |
+
|
| 481 |
+
Measure elapsed time:
|
| 482 |
+
import time
|
| 483 |
+
t0 = time.perf_counter()
|
| 484 |
+
... work ...
|
| 485 |
+
print("elapsed %.3f s" % (time.perf_counter() - t0))
|
| 486 |
+
|
| 487 |
+
|
| 488 |
+
--------------------------------------------------------------------------------
|
| 489 |
+
15) NUMPY + PANDAS / OTHER PACKAGES
|
| 490 |
+
--------------------------------------------------------------------------------
|
| 491 |
+
|
| 492 |
+
numpy is the foundation for many packages already on the device:
|
| 493 |
+
|
| 494 |
+
import numpy as np
|
| 495 |
+
import pandas as pd
|
| 496 |
+
df = pd.DataFrame({"a": [1, 2, 3], "b": [4.0, 5.0, 6.0]})
|
| 497 |
+
print(df)
|
| 498 |
+
arr = df.to_numpy() # DataFrame -> numpy array
|
| 499 |
+
# pandas is built on numpy; everything in this guide applies.
|
| 500 |
+
|
| 501 |
+
# OpenCV (if installed) also exchanges buffers directly:
|
| 502 |
+
# cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
|
| 503 |
+
|
| 504 |
+
|
| 505 |
+
--------------------------------------------------------------------------------
|
| 506 |
+
16) PITFALLS & NOTES ON THIS BUILD
|
| 507 |
+
--------------------------------------------------------------------------------
|
| 508 |
+
|
| 509 |
+
- Version is 2.5.2. numpy 2.x changed some 1.x behaviors:
|
| 510 |
+
* np.array(None) no longer allowed
|
| 511 |
+
* np.find_common_type removed
|
| 512 |
+
* copy keyword defaults changed (np.array(..., copy=None) is common)
|
| 513 |
+
Code written for numpy 1.x may need small fixes.
|
| 514 |
+
- uint8 overflow: cast to a wider dtype before math on images.
|
| 515 |
+
- Integer division: use // for floor, / for true (float) division.
|
| 516 |
+
- Broadcasting: shapes must be equal or one must be 1; (3,1) * (1,4) -> (3,4).
|
| 517 |
+
- np.asarray may share memory with the source (PIL image); use .copy() to
|
| 518 |
+
detach.
|
| 519 |
+
- OpenBLAS is compiled in - @ and np.linalg.* are fast; no action needed.
|
| 520 |
+
- Wheels here are tagged cp312-cp312-linux_aarch64 / linux_x86_64
|
| 521 |
+
(this Android build uses the "linux" platform tag for numpy). Make sure you
|
| 522 |
+
install the wheel that matches the device ABI (arm64 phone vs x86_64 emulator).
|
| 523 |
+
- Temp files are not needed: save directly to /storage/emulated/0/Download/
|
| 524 |
+
or any folder the app can write.
|
| 525 |
+
- For very large arrays, watch memory: a float64 array of 10M elements uses
|
| 526 |
+
80 MB. Use float32 or appropriate dtypes when possible.
|
| 527 |
+
- Reinstall safety: keep a copy of the wheel file
|
| 528 |
+
(numpy-2.5.2-cp312-cp312-linux_aarch64.whl or _x86_64) in
|
| 529 |
+
/storage/emulated/0/Download/ so you can reinstall if needed.
|
| 530 |
+
|
| 531 |
+
================================================================================
|
| 532 |
+
END OF GUIDE
|
| 533 |
+
Generated by RIMI
|
| 534 |
+
================================================================================
|