-
Notifications
You must be signed in to change notification settings - Fork 0
Text csrmatrix
The compressed-sparse-row matrix every vectorizer returns: one row per document, one column per feature, and only the non-zero entries stored.
A corpus of ten thousand documents over fifty thousand terms has five hundred million cells and
perhaps a million non-zero ones. Storing the zeros is what this layout exists to avoid, and it is
the same layout scipy.sparse.csr_matrix uses, so a reader who knows one knows the other.
public sealed class CsrMatrixProperties — RowCount and ColumnCount are the logical shape, zeros included.
NonZeroCount is how many cells are actually stored. Values holds those cells, ColumnIndices
the column each one sits in, and RowPointers where each row starts and ends: row i occupies
Values[RowPointers[i]..RowPointers[i + 1]]. RowPointers therefore has RowCount + 1 entries,
and its last is NonZeroCount.
Example — three documents, five terms, and the three arrays that describe them.
using Lodestar.Text.Vectorization;
string[] docs = ["the cat eats", "the dog eats", "the cat and the dog"];
CsrMatrix counts = new CountVectorizer().FitTransform(docs);
int rows = counts.RowCount; // => 3
int columns = counts.ColumnCount; // => 5
int stored = counts.NonZeroCount; // => 10
// Row 2 runs from RowPointers[2] to RowPointers[3].
int start = counts.RowPointers[2]; // => 6
int end = counts.RowPointers[3]; // => 10Remarks — fifteen cells, ten of them stored: the third document is the only one holding and,
and the first two hold neither and nor one of cat/dog.
The three arrays are exposed rather than hidden because reading them is often the point — feeding
another library, writing a file format, or checking what a vectorizer produced. They are the
matrix's own double[] and int[], handed out without copying, so writing to one changes the
matrix. Treat them as read-only unless that is precisely what you mean.
Within a row, ColumnIndices is ascending. That is what makes a row comparable to another row in
one pass, and it is what Multiply relies on.
Applies to — net10.0, netstandard2.0.
See also — CountVectorizer, SparseNorm, the
vectorization guide, the
Python equivalence table.
| Member | What it does |
|---|---|
CsrMatrix.Multiply |
The matrix times a dense vector. |
CsrMatrix.NormalizeRows |
Divide every row by its own norm, in place. |
CsrMatrix.RowL1Norm |
The sum of one row's absolute values. |
CsrMatrix.RowL2Norm |
The Euclidean length of one row. |
CsrMatrix.ToDense |
The same matrix with its zeros written out. |
- 0001-target-framework
- 0002-unicode-comparison-unit
- 0003-provenance-and-licensing
- 0004-levenshtein-myers-backlog
- 0005-hamming-jellyfish-divergence
- 0006-ratcliff-autojunk
- 0007-metaphone-scope
- 0008-italian-enza-nltk-divergence
- 0009-sample-consumes-a-local-feed
- 0010-stop-word-list-provenance
- 0011-persistence-format
- 0012-per-package-versioning
- 0013-sentencepiece-parity-scope
- 0014-precompiled-normalizer
- 0015-sonar-rules-in-the-build
- 0016-metrics-package-placement
- 0017-bpe-parity-scope
- 0018-multiclass-roc-auc-parallelism-is-opt-in
- 0019-the-net-analysers-run-in-the-build-too
- 0020-normalize-is-a-projection-not-a-parameter
- 0021-multioutput-is-a-method-not-an-enum
- 0022-added-token-matching-flags
- 0023-byte-level-decode-substitutes
- 0024-weighted-median-averages-within-scikit-learns-epsilon
- 0025-quickselect-replaces-a-full-sort-for-the-median
- 0026-r2-and-explainedvariance-split-their-undefined-cases-differently
- 0027-r2-and-explainedvariance-vectorize-only-a-single-output
- 0028-log1p-is-kahans-identity-not-math-log-1-plus-x
- 0029-balanced-accuracy-adjusted-is-left-to-ieee-754-at-the-edge
- 0030-cohen-kappa-keeps-scikit-learns-expected-matrix-orientation
- 0031-nosamplecorrect-mirrors-numpys-float64-upcast
- 0032-fbeta-substitutes-tp-predicted-and-support-algebraically
- 0033-compensated-sum-is-neumaiers-variant
- 0034-dropout-is-refused-for-want-of-a-user
- 0035-a-null-pre-split-is-removed-with-invert-not-isolated
- 0036-a-member-may-ship-without-an-oracle-if-it-says-so
- 0037-the-guards-run-before-the-commit
- 0038-the-gate-confronts-an-exception-tag-with-the-page-that-documents-it
- 0039-mutual-information-returns-zero-on-an-empty-input
- 0040-a-curve-is-a-sealed-class-per-curve
- 0041-one-sample-file-per-public-class
- 0042-phonetic-encoders-refuse-a-null-word
- 0043-the-equality-table-is-sized-to-the-pattern
- 0044-compression-belongs-to-the-caller
- 0045-a-console-call-carries-its-reason-on-the-line
- 0046-check-adr-immutable-runs-in-ci-only
- 0047-one-gate-per-kernel-not-one-per-alphabet
- 0048-the-gate-depends-on-the-kernel-and-the-alphabet
- 0049-two-gates-per-kernel-tested-where-the-width-is-known
- 0050-the-sentencepiece-bpe-lineage-stays-a-bpe-model
- benchmark_latest
- decisions
- equivalence
- matplotlib
- migration
- nightly_run
- numpy
- pandas
- performance
- pytorch
- seaborn
- sklearn
- statsmodels