Delete numpy/NUMPY_USER_GUIDE.txt
Browse files- numpy/NUMPY_USER_GUIDE.txt +0 -534
numpy/NUMPY_USER_GUIDE.txt
DELETED
|
@@ -1,534 +0,0 @@
|
|
| 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 |
-
================================================================================
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|