Sparse
Sparse vectors.
>>> from vector import vecsadd
>>> v = {0:1}
>>> w = {0:2, 3:4}
>>> vecsadd(a, b)
{0:3, 3:4}
Prefixed by vecs... (vector - sparse).
All functions accept vectors and return them as dicts (index:coefficient).
The functions are type-independent. However, the data types used must support necessary scalar operations. For instance, for vector addition, coefficients must be addable.
Index keys are expected to be integers.
Docstring conventions
Summary
Math notation (vector notation if possible, index notation, domain & codomain)
More information ("More efficient than ...").
Complexity
For a vector with \(n\) elements there will be - \(x\) scalar additions (add), ...
Notes
Design choices
See also
Similar functions
References
Wikipedia, numpy, ...
creation
vecszero = {}
Zero vector.
An empty dictionary: {}.
vecsbasis(i, c=1)
Return a basis vector.
Returns a dictionary with a single element i:c.
See also
- for all basis vectors:
vecsbases
Source code in vector\sparse\creation.py
22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
vecsbases(start=0, c=1)
Yield all basis vectors.
See also
- for single basis vector:
vecsbasis
Source code in vector\sparse\creation.py
37 38 39 40 41 42 43 44 45 46 47 48 49 | |
vecsrand(n)
Return a random vector of uniform sampled float coefficients.
The coefficients are sampled from a uniform distribution in [0, 1[.
Notes
Naming like numpy.random,
because seems more concise (not random & gauss as in the stdlib).
Source code in vector\sparse\creation.py
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | |
vecsrandn(n, normed=True, mu=0, sigma=1, weights=None)
Return a random vector of normal sampled float coefficients.
The coefficients are sampled from a normal distribution.
Notes
Naming like numpy.random,
because seems more concise (not random & gauss as in the stdlib).
Source code in vector\sparse\creation.py
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | |
conversion
vecstod(v, zero=0)
Return a sparse vector (dict) as a dense vector (tuple).
Source code in vector\sparse\conversion.py
5 6 7 8 9 10 | |
vecdtos(v)
Return a dense vector (tuple) as a sparse vector (dict).
The resulting dict is not trimmed.
Source code in vector\sparse\conversion.py
12 13 14 15 16 17 | |
utility
vecslen(v)
Return the maximum set index plus one.
Doesn't handle trailing zeros, use vecstrim
if needed.
Source code in vector\sparse\utility.py
9 10 11 12 13 14 15 | |
vecseq(v, w)
Return whether two vectors are equal.
Complexity
For two vectors of lengths \(n\) & \(m\) there will be at most
- \(\min\{n, m\}\) scalar comparisons (
eq) & - \(|n-m|\) scalar boolean evaluations (
bool).
Source code in vector\sparse\utility.py
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | |
vecstrim(v, tol=None)
Remove all near zero (abs(v_i)<=tol) coefficients.
tol may also be None,
then all coefficients that evaluate to False are trimmed.
Complexity
For a vector of \(n\) elements there will be
- \(n\) scalar absolute evaluations (
abs) & - \(n\) scalar comparisons (
gt).
Notes
- Cutting of elements that are
abs(v_i)<=tolinstead ofabs(v_i)<tolto allow cutting of elements that are exactly zero bytrim(v, 0)instead oftrim(v, sys.float_info.min).
Source code in vector\sparse\utility.py
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | |
vecsitrim(v, tol=None)
Remove all near zero (abs(v_i)<=tol) coefficients.
tol may also be None,
then all coefficients that evaluate to False are trimmed.
Complexity
For a vector of \(n\) elements there will be
- \(n\) scalar absolute evaluations (
abs) & - \(n\) scalar comparisons (
gt).
Notes
- Cutting of elements that are
abs(v_i)<=tolinstead ofabs(v_i)<tolto allow cutting of elements that are exactly zero bytrim(v, 0)instead oftrim(v, sys.float_info.min).
Source code in vector\sparse\utility.py
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | |
vecsrshift(v, n)
Shift coefficients up.
Source code in vector\sparse\utility.py
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | |
vecsirshift(v, n)
Shift coefficients up.
Source code in vector\sparse\utility.py
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | |
vecslshift(v, n)
Shift coefficients down.
Source code in vector\sparse\utility.py
145 146 147 148 149 150 151 152 153 154 155 156 | |
vecsilshift(v, n)
Shift coefficients down.
Source code in vector\sparse\utility.py
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | |
hilbert_space
vecsconj(v)
Return the complex conjugate.
Tries to call a method conjugate on each element.
If not found, simply keeps the element as is.
Complexity
For a vector of \(n\) elements there will be
- \(n\) scalar conjugations.
Source code in vector\sparse\hilbert_space.py
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
vecsiconj(v)
Complex conjugate.
Tries to call a method conjugate on each element.
If not found, simply keeps the element as is.
Complexity
For a vector of \(n\) elements there will be
- \(n\) scalar conjugations.
Source code in vector\sparse\hilbert_space.py
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | |
vecsabs(v, weights=None, conjugate=False, zero=0)
Return the Euclidean/\(\ell_{\mathbb{N}_0}^2\)-norm.
Returns the square root of vecsabsq.
Complexity
For a vector of \(n\) elements there will be
- \(n\) scalar conjugations (
conjugate) (if selected), - \(n\)/\(2n\) scalar multiplications (
mul) without/with weights, - \(\begin{cases}n-1&n\ge1\\0&n\le1\end{cases}\) scalar additions (
add) & - one
^0.5call.
See also
- squared version without square root:
vecsabsq
Source code in vector\sparse\hilbert_space.py
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | |
vecsabsq(v, weights=None, conjugate=False, zero=0)
Return the sum of absolute squares.
Notes
Reasons why it exists:
- Occurs in math.
- Most importantly: type independent because it doesn't use
sqrt.
References
Source code in vector\sparse\hilbert_space.py
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | |
vecsdot(v, w, weights=None, conjugate=False, zero=0)
Return the inner product.
Source code in vector\sparse\hilbert_space.py
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | |
vector_space
vecspos(v)
Return the identity.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar unary plus operations (
pos).
Source code in vector\sparse\vector_space.py
15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
vecsipos(v)
Apply unary plus.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar unary plus operations (
pos).
Source code in vector\sparse\vector_space.py
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | |
vecsneg(v)
Return the negation.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar negations (
neg).
Source code in vector\sparse\vector_space.py
47 48 49 50 51 52 53 54 55 56 57 58 59 60 | |
vecsineg(v)
Negate.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar negations (
neg).
Source code in vector\sparse\vector_space.py
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | |
vecsadd(*vs)
Return the sum.
Complexity
For two vectors with \(n\) & \(m\) elements there will be
- \(\min\{n, m\}\) scalar additions (
iadd) & - \(\begin{cases}m-n&m\ge n\\0&m\le n\end{cases}\) unary plus operations (
pos).
See also
- for sum on a single coefficient:
vecsaddc
Source code in vector\sparse\vector_space.py
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | |
vecsiadd(v, *ws)
Add.
Complexity
For two vectors with \(n\) & \(m\) elements there will be
- \(\min\{n, m\}\) scalar additions (
iadd) & - \(\begin{cases}m-n&m\ge n\\0&m\le n\end{cases}\) unary plus operations (
pos).
See also
- for sum on a single coefficient:
vecsiaddc
Source code in vector\sparse\vector_space.py
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | |
vecsaddc(v, c, i=0)
Return the sum with a basis vector.
Complexity
There will be
- one scalar addition (
iadd) if \(i\in\vec{v}\) or - one unary plus operation (
pos) otherwise.
See also
- for sum on more coefficients:
vecsadd
Source code in vector\sparse\vector_space.py
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | |
vecsiaddc(v, c, i=0)
Add a basis vector.
Complexity
There will be
- one scalar addition (
iadd) if \(i\in\vec{v}\) or - one unary plus operation (
pos) otherwise.
See also
- for sum on more coefficients:
vecsiadd
Source code in vector\sparse\vector_space.py
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | |
vecssub(v, w)
Return the difference.
Complexity
For two vectors with \(n\) & \(m\) elements there will be
- \(\min\{n, m\}\) scalar subtractions (
isub) & - \(\begin{cases}m-n&m\ge n\\0&m\le n\end{cases}\) negations (
neg).
See also
- for difference on a single coefficient:
vecssubc
Source code in vector\sparse\vector_space.py
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | |
vecsisub(v, w)
Subtract.
Complexity
For two vectors with \(n\) & \(m\) elements there will be
- \(\min\{n, m\}\) scalar subtractions (
isub) & - \(\begin{cases}m-n&m\ge n\\0&m\le n\end{cases}\) negations (
neg).
See also
- for difference on a single coefficient:
vecsisubc
Source code in vector\sparse\vector_space.py
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | |
vecssubc(v, c, i=0)
Return the difference with a basis vector.
Complexity
There will be
- one scalar subtraction (
isub) if \(i\in\vec{v}\) or - one scalar negation (
neg) otherwise.
See also
- for difference on more coefficients:
vecssub
Source code in vector\sparse\vector_space.py
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 | |
vecsisubc(v, c, i=0)
Subtract a basis vector.
Complexity
There will be
- one scalar subtraction (
isub) if \(i\in\vec{v}\) or - one scalar negation (
neg) otherwise.
See also
- for difference on more coefficients:
vecsisub
Source code in vector\sparse\vector_space.py
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 | |
vecsmul(v, a)
Return the product.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar multiplications (
mul).
Source code in vector\sparse\vector_space.py
281 282 283 284 285 286 287 288 289 290 291 292 293 294 | |
vecsrmul(a, v)
Return the product.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar multiplications (
rmul).
Source code in vector\sparse\vector_space.py
296 297 298 299 300 301 302 303 304 305 306 307 308 309 | |
vecsimul(v, a)
Multiply.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar multiplications (
imul).
Source code in vector\sparse\vector_space.py
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 | |
vecstruediv(v, a)
Return the true quotient.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar true divisions (
truediv).
Notes
Why called truediv instead of div?
divwould be more appropriate for an absolutely clean mathematical implementation, that doesn't care about the language used. But the package might be used for pure integers/integer arithmetic, so both,truedivandfloordivoperations have to be provided, and none should be privileged over the other by getting the universaldivname.truediv/floordivis unambiguous, like Pythonoperators.
Source code in vector\sparse\vector_space.py
328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 | |
vecsitruediv(v, a)
True divide.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar true divisions (
itruediv).
Notes
Why called truediv instead of div?
divwould be more appropriate for an absolutely clean mathematical implementation, that doesn't care about the language used. But the package might be used for pure integers/integer arithmetic, so both,truedivandfloordivoperations have to be provided, and none should be privileged over the other by getting the universaldivname.truediv/floordivis unambiguous, like Pythonoperators.
Source code in vector\sparse\vector_space.py
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 | |
vecsfloordiv(v, a)
Return the floor quotient.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar floor divisions (
floordiv).
Source code in vector\sparse\vector_space.py
382 383 384 385 386 387 388 389 390 391 392 393 394 395 | |
vecsifloordiv(v, a)
Floor divide.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar floor divisions (
ifloordiv).
Source code in vector\sparse\vector_space.py
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 | |
vecsmod(v, a)
Return the remainder.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar modulos (
mod).
Source code in vector\sparse\vector_space.py
414 415 416 417 418 419 420 421 422 423 424 425 426 427 | |
vecsimod(v, a)
Mod.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar modulos (
imod).
Source code in vector\sparse\vector_space.py
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 | |
vecsdivmod(v, a)
Return the floor quotient and remainder.
Complexity
For a vector with \(n\) elements there will be
- \(n\) scalar divmods (
divmod).
Source code in vector\sparse\vector_space.py
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 | |
elementwise
vecshadamard(*vs)
Return the elementwise product.
Source code in vector\sparse\elementwise.py
11 12 13 14 15 16 17 18 19 20 21 22 23 | |
vecshadamardtruediv(v, w)
Return the elementwise true quotient.
Source code in vector\sparse\elementwise.py
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |
vecshadamardfloordiv(v, w)
Return the elementwise floor quotient.
Source code in vector\sparse\elementwise.py
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | |
vecshadamardmod(v, w)
Return the elementwise remainder.
Source code in vector\sparse\elementwise.py
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | |
vecshadamarddivmod(v, w)
Return the elementwise floor quotient and remainder.
Source code in vector\sparse\elementwise.py
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | |
vecshadamardmin(*vs, key=None)
Return the elementwise minimum.
Source code in vector\sparse\elementwise.py
89 90 91 92 93 94 95 96 97 98 99 100 101 | |
vecshadamardmax(*vs, key=None)
Return the elementwise maximum.
Source code in vector\sparse\elementwise.py
103 104 105 106 107 108 109 110 111 112 113 114 115 | |