NumSharp 0.50.0-prerelease
See the version list below for details.
dotnet add package NumSharp --version 0.50.0-prerelease
NuGet\Install-Package NumSharp -Version 0.50.0-prerelease
<PackageReference Include="NumSharp" Version="0.50.0-prerelease" />
<PackageVersion Include="NumSharp" Version="0.50.0-prerelease" />
<PackageReference Include="NumSharp" />
paket add NumSharp --version 0.50.0-prerelease
#r "nuget: NumSharp, 0.50.0-prerelease"
#:package NumSharp@0.50.0-prerelease
#addin nuget:?package=NumSharp&version=0.50.0-prerelease&prerelease
#tool nuget:?package=NumSharp&version=0.50.0-prerelease&prerelease
This release introduces Int64/Long Indexing - a complete architectural migration enabling arrays larger than 2.1 billion elements (>2GB), along with comprehensive NumPy 2.x type system alignment, new type introspection APIs, and the Python container protocol.
Installable via NuGet
dotnet add package NumSharp --version 0.50.0-prerelease
dotnet add package NumSharp.Bitmap --version 0.50.0-prerelease
TL;DR
- Int64/Long Indexing: Full migration from
inttolongacross Shape, NDArray, Storage, Iterators, and ILKernelGenerator - ndarrays >2GB now supported - 12 New Type APIs:
np.can_cast,np.promote_types,np.result_type,np.min_scalar_type,np.common_type,np.issubdtype,np.finfo,np.iinfo,np.isreal,np.iscomplex,np.isrealobj,np.iscomplexobj - 6 Comparison Functions:
np.equal,np.not_equal,np.less,np.greater,np.less_equal,np.greater_equal - 4 Logical Functions:
np.logical_and,np.logical_or,np.logical_not,np.logical_xor - Container Protocol:
__contains__,__len__,__iter__,__getitem__,__setitem__- NumPy-compatible iteration - New NDArray Methods:
tolist(),item()for NumPy parity - NumPy 2.x Type System:
np.arange()returns Int64,NPTypeHierarchyencoding NumPy's exact type tree, Bool NOT under Number np.frombuffer()Rewrite: Full NumPy signature withcount,offset, big-endian support,IntPtr/void*overloads, view semantics- 0D Scalar Arrays:
np.array(5)now creates 0D arrays (matching NumPy) np.arange()Fixes: Negative step, integer arithmetic, inlined type-specific loops, full NumPy parity.np.any/np.all: 0D array support with axis parameter- Random API Alignment (#582): Parameter names match NumPy,
np.shufflefixed - Empty Array Handling: Proper NaN returns for mean/std/var on empty arrays
- NaN Sorting:
np.uniquenow sorts NaN to end (matches NumPy) - ValueType to Object Migration: All scalar returns now
object(NumPy alignment), discarded usages of ValueType - UnmanagedSpan<T>: Ported from dotnet/runtime for Span-like semantics with
longlength - Operator Cleanup: 74% reduction in NDArray.Primitive.cs (150 → 40 overloads)
- 600+ Battle Tests: All validated against actual NumPy 2.x output
- 145 Test Fixes: 71 for Int64 alignment + 74 previously failing tests now passing
Changes and Fixes
np.arange(10, 0, -2): Before returned[9, 7, 5, 3, 1], now correctly returns[10, 8, 6, 4, 2]np.arange(0, 5, 0.5, int32): Before returned[0,0,1,1,2,2,3,3,4,4], now correctly returns[0,0,0,0,0,0,0,0,0,0](NumPy behavior)np.any(0D_array, axis=0): Before threwArgumentException, now returns 0D bool scalarnp.all(0D_array, axis=-1): Before threwArgumentException, now returns 0D bool scalarContains([1,2], array([1,2,3])): Before returnedFalse, now throwsIncorrectShapeException(matches NumPy)np.shuffleaxis parameter: Removed non-existentaxisparam, now matches NumPy legacy APInp.random.standard_normal: Fixed typo (stardard_normal→standard_normal)- Scalar broadcast assignment: Fixed cross-dtype conversion failure
- Root cause:
AsOrMakeGeneric<T>()callednew NDArray<T>(astype(...))which triggered implicit scalar → size constructor - Fix: Use
.Storageto pass storage directly, avoiding implicit conversion
- Root cause:
- Fancy indexing dtypes: Now supports all integer dtypes (Int16, Int32, Int64), not just Int32
- Added
NormalizeIndexArray()helper that keeps Int32/Int64 as-is, converts smaller types to Int64 - Throws
IndexOutOfRangeExceptionfor non-integer types (float, decimal)
- Added
- NDArray.ToString() now formats 100% identical to numpy.
np.mean([]): ReturnsNaN(was throwing or returning 0)np.mean(zeros((0,3)), axis=0): Returns[NaN, NaN, NaN]np.mean(zeros((0,3)), axis=1): Returns empty array[]np.std/varsingle element: ReturnsNaNwithddof >= size- Empty comparison: All 6 comparison operators now return empty boolean arrays (was returning scalar)
np.uniqueNaN sorting: NaN now sorts to end (matches NumPy:[-inf, 1, 2, inf, nan])ArgMax/ArgMinNaN: First NaN always wins (NaN takes precedence over any value)- Single-element axis reduction: Changed
Storage.Alias()andsqueeze_fast()to return copies (was sharing memory) - Clip mixed-dtype: Fixed bug where int32 min/max arrays were read as int64
np.invert(bool): Now uses logical NOT (!x) instead of bitwise NOT (~x)np.square(int): Preserves integer dtype instead of promoting to doublenp.negate(bool): Removed buggy linear-indexing path, now routes throughExecuteUnaryOp- Fixed ATan2 non-contiguous array handling by adding
np.broadcast_arrays()and.copy()materialization - Fixed ATan2 wrong pointer type (byte*) for x operand in all non-byte cases
- finfo: Use
MathF.BitIncrementfor float eps (was usingMath.BitIncrementwhich only works on double) - issctype: Properly reject string type (was returning true for
typeof(string)) NDArray.unique(): Fixed for long indexing supportnp.repeat: Fixed dtype handling and long count supportnp.random.choice: Fixed for long population sizesnp.argmax/argminIL fix: RemovedConv_I4instruction that truncated long indices to int32- ILKernel loop counters: Fixed numerous int32 overflow issues
TransformOffsetcalculations: Fixed for >2GB arrays- SIMD helper functions: Fixed for long indexing
- AVX2 gather: Added stride check (falls back to scalar for stride > int.MaxValue)
- Parameter names now match NumPy (
size,a,b,p,d0) np.random()added as alias for uniform distributionnp.shuffleremoved non-existent axis parameter- ValueType to Object Migration
- All scalar return types migrated from
ValueTypetoobject NPTypeCode.GetDefaultValue()now returnsobject- All operators migrated to NumPy-aligned object pattern
- NDArray null checks converted from
== nulltois nullpattern
- All scalar return types migrated from
- Operator Overload Cleanup
NDArray.Primitive.cs: 159 → 42 lines (74% reduction)- ~150 explicit scalar overloads → ~40 object-based overloads
- Added missing
implicit operator NDArray(byte) - Changed
ushortfrom explicit to implicit
- Implicit Scalar Conversion
(int)ndarray_float64now works viaConverts.ChangeTypescalar → NDArray: implicit (safe, creates 0-d array)NDArray → scalar: explicit (requires 0-d, throwsIncorrectShapeException)- Matches NumPy's
int(arr),float(arr),bool(arr)pattern
- All
== nullchanged tois null(because==now returnsNDArray<bool>as does numpy) - All
!= nullchanged tois not null - Type System Consolidation
can_castderived from promotion tables (replaced 80+ lines of switch cases)- Single source of truth:
NPTypeHierarchy - Removed duplicate
TypeKindenum and category helper methods
Detailed Breakdown
<details> <summary>Read More</summary>
Contents
- Int64/Long Indexing
- NumPy 2.x Type System
- Container Protocol
- New APIs
- Changes and Fixes
- Performance
- Test Improvements
Int64/Long Indexing Support
Complete migration from int to long indexing across the entire codebase, enabling arrays larger than 2.1 billion elements (~2GB for byte arrays, ~16GB for doubles).
Core Type Changes
Shape.dimensions:int[]→long[]Shape.strides:int[]→long[]Shape.size:int→longShape.offset:int→longNDArray.size:int→longNDArray.len:int→long- All NDArray indexers:
int→long ArraySlice<T>:intindexing →longindexingUnmanagedMemoryBlock<T>:intindexing →longindexingUnmanagedStorage:intindexing →longindexingNDIteratorcoordinates:int[]→long[]MultiIterator:intoffsets →longoffsetsnp.nonzero(): ReturnsNDArray<long>[]instead ofNDArray<int>[]np.argmax/argmin: Returnslongindices
ILKernelGenerator Migration (20+ files)
All ILKernelGenerator partial classes updated for long loop counters and offsets:
ILKernelGenerator.Binary.cs- Loop counters tolongILKernelGenerator.Reduction.cs- Index variables tolongILKernelGenerator.Reduction.Axis.cs- Axis iteration withlongILKernelGenerator.Reduction.Axis.Simd.cs- SIMD paths withlongILKernelGenerator.Reduction.Axis.NaN.cs- NaN handling withlongILKernelGenerator.Reduction.Axis.Arg.cs- ArgMax/ArgMin withlongILKernelGenerator.Reduction.Axis.VarStd.cs- Variance/StdDev withlongILKernelGenerator.Reduction.NaN.cs- NEW NaN reductions IL generationILKernelGenerator.Scan.cs- CumSum/CumProd withlongindicesILKernelGenerator.MatMul.cs- Matrix dimensions tolongILKernelGenerator.Clip.cs- TransformOffset calculationsILKernelGenerator.Masking.cs- Boolean masking withlongILKernelGenerator.Masking.Boolean.cs- Boolean operations withlongILKernelGenerator.Masking.NaN.cs- NaN masking withlongILKernelGenerator.Masking.VarStd.cs- Variance masking withlong
New Infrastructure
UnmanagedSpan<T>- Ported from dotnet/runtime Span<T> - Span-like withlonglengthReadOnlyUnmanagedSpan<T>- Read-only variantUnmanagedSpanExtensions- Extension methods for Span<T> parityUnmanagedSpanHelpers- SIMD-optimized value type methodsUnmanagedSpanHelpers.T.cs- Generic type helpersUnmanagedBuffer- Buffer management for long arraysLongIntroSort- Sorting algorithm for large arrays (port of .NET IntroSort)LongIndexBuffer- Unmanaged index collection (replaces List<long> for >2B indices)BitHelperLong- Long-indexed bit marking (for >2B bits)IndexCollector.cs- NEW Index collection for masking operationsHashset<T>- Upgraded to long-based indexing with 33% growth
New API Overloads
NDArray.GetInt32(long[])- Long coordinate accessNDArray.GetInt64(long[])- Long coordinate accessNDArray.GetSingle(long[])- Long coordinate accessNDArray.GetDouble(long[])- Long coordinate accessNDArray.GetBoolean(long[])- Long coordinate accessNDArray.GetByte(long[])- Long coordinate access- All 9 typed setters with
long[]coordinates - All other typed getters with
long[]coordinates np.random.choice-longpopulation size supportnp.repeat-longrepeat countsnp.linspace-longnum parameternp.roll-longshift parameter- All random sampling functions -
long[]size parameters
NumPy 2.x Type System
np.arange() Returns Int64
np.arange(10)- Before:Int32, After:Int64np.arange(10.0)- Unchanged:Float64- Integer arithmetic now performed in target dtype (matches NumPy's template approach)
- Inlined type-specific loops matching NumPy's
arraytypes.c.srcimplementation
NPTypeHierarchy
New NPTypeHierarchy.cs (294 lines) encoding NumPy's exact type tree structure from multiarraymodule.c:
- Bool is NOT under Number (NumPy 2.x critical behavior)
NPTypeHierarchy.IsSubType(Bool, Number)returnsfalseissubdtype(int32, int64)returnsfalse(concrete types are siblings)isdtype(bool, 'numeric')returnsfalse(bool excluded from numeric)
New Type Introspection APIs (12)
np.can_cast(from, to, casting)- Full NumPy-compatible type casting checks with 'no', 'equiv', 'safe', 'same_kind', 'unsafe' modesnp.promote_types(type1, type2)- Type promotion following NumPy rulesnp.result_type(*args)- Result type inference for arrays and dtypesnp.min_scalar_type(value)- Minimum scalar type for a valuenp.common_type(*arrays)- Common type for multiple arraysnp.issubdtype(arg1, arg2)- Type hierarchy checkingnp.finfo(dtype)- Machine limits for floating-point types (eps, min, max, resolution)np.iinfo(dtype)- Machine limits for integer types (min, max, bits)np.isreal(x)- Check if array has no imaginary partnp.iscomplex(x)- Check if array has imaginary partnp.isrealobj(x)- Check if object is real typenp.iscomplexobj(x)- Check if object is complex type
C#-Friendly Overloads
iinfo<T>(),finfo<T>()- Generic overloadscan_cast<TFrom, TTo>()- Generic type checkingpromote_types<T1, T2>()- Generic promotion- NDArray and string dtype overloads for all functions
can_cast Refactoring
Replaced 80+ lines of switch cases with single-line derivation:
CanCastSafe(A, B) = (A == B) || (_FindCommonType_Array(A, B) == B)
Verified against NumPy for all 121 type pairs (11x11 matrix).
Container Protocol
New NDArray.Container.cs implementing Python's container protocol for NumPy compatibility.
Implemented Methods
__contains__/Contains()- Membership testing via element-wise comparison__hash__/GetHashCode()- ThrowsNotSupportedException(NDArray is mutable/unhashable)__len__- Returns first dimension length, throwsTypeErrorfor 0-d scalars__iter__/GetEnumerator()- NumPy-compatible iteration over first axis__getitem__- Indexing with int/long/string slice notation__setitem__- Assignment with int/long/string slice notation
Iteration Behavior (BREAKING)
- 0-D arrays (scalars): Throws
TypeError(not iterable) - 1-D arrays: Yields scalar elements
- N-D arrays (N > 1): Yields (N-1)-D NDArray slices along first axis
This matches NumPy:
>>> for x in np.array([[1,2],[3,4]]): print(x)
[1 2]
[3 4]
New Exception
TypeError.cs- For NumPy-compatible error messages
New APIs
Comparison Functions (6 new)
np.equal(x1, x2)- Element-wise equality (wraps==)np.not_equal(x1, x2)- Element-wise inequality (wraps!=)np.less(x1, x2)- Element-wise less than (wraps<)np.greater(x1, x2)- Element-wise greater than (wraps>)np.less_equal(x1, x2)- Element-wise less or equal (wraps<=)np.greater_equal(x1, x2)- Element-wise greater or equal (wraps>=)
Logical Functions (4 new)
np.logical_and(x1, x2)- Element-wise logical ANDnp.logical_or(x1, x2)- Element-wise logical ORnp.logical_not(x)- Element-wise logical NOTnp.logical_xor(x1, x2)- Element-wise logical XOR
NDArray Methods
NDArray.tolist() - Convert NDArray to nested lists (NumPy parity):
var arr = np.array(new int[,] {{1,2}, {3,4}});
var list = arr.tolist(); // List<object> containing nested lists
NDArray.item(*args) - Copy element to standard scalar:
item()- Extract scalar from size-1 arraysitem(index)- Flat indexing with negative index supportitem(i, j)/item(i, j, k)- Multi-dimensional indexingitem<T>()- Type-converting variantnp.asscalar()marked as[Obsolete](removed in NumPy 2.0)
Operator Files
NDArray.BitwiseNot.cs-~operator implementationNDArray.XOR.cs-^operator with object pattern
np.frombuffer() Complete Rewrite
NumPy-compatible signature:
np.frombuffer(buffer, dtype=float64, count=-1, offset=0)
Features:
countparameter - Number of items to read (-1 = all available)offsetparameter - Byte offset into buffer- Big-endian support via dtype strings (
">u4",">i4","<i2") ArraySegment<byte>overload - Uses built-in Offset/CountMemory<byte>overload - View if array-backed, otherwise copiesIntPtr+ dispose overload - Native interop with optional ownershipvoid*overload - Unsafe pointer conveniencefrombuffer<TSource>(TSource[], dtype)- Reinterpret typed arrays- View semantics - Pinned buffer, modifications affect original
Scalar Array Creation
np.array(5)now correctly creates 0D arrays (matching NumPy)- Previously created 1D single-element arrays
keepdims Parameter
np.argmax(axis, keepdims)- Added keepdims parameternp.argmin(axis, keepdims)- Added keepdims parameter
Parameter Rename
outTyperenamed todtypein 19 np.*.cs files to match NumPy
Performance Improvements
SIMD NaN Statistics
New ILKernelGenerator.Reduction.NaN.cs (1,097 lines) providing SIMD optimization for:
np.nansum- Sum ignoring NaNnp.nanprod- Product ignoring NaNnp.nanmin- Minimum ignoring NaNnp.nanmax- Maximum ignoring NaNnp.nanmean- Mean ignoring NaNnp.nanvar- Variance ignoring NaNnp.nanstd- Standard deviation ignoring NaN
SIMD Algorithm (NaN masking via self-comparison):
nanMask = Equals(vec, vec) // True for non-NaN
cleaned = BitwiseAnd(vec, nanMask) // Zero out NaN values
SIMD Helper Functions (IKernelProvider)
AllSimdHelper<T>()- SIMD-accelerated boolean all() with early-exitAnySimdHelper<T>()- SIMD-accelerated boolean any() with early-exitArgMaxSimdHelper<T>()- Two-pass SIMD: find max value, then find indexArgMinSimdHelper<T>()- Two-pass SIMD: find min value, then find indexNonZeroSimdHelper<T>()- Collects indices where elements != 0CountTrueSimdHelper()- Counts true values in bool arrayCopyMaskedElementsHelper<T>()- Copies elements where mask is trueConvertFlatIndicesToCoordinates()- Converts flat indices to arrays
np.arange() Optimization
- Inlined type-specific loops (no delegate overhead per element)
- Direct pointer casts:
addr[i] = (int)(start + i * step) - Matches NumPy's
arraytypes.c.srcfill pattern
MatMul Long Indexing
- SIMD MatMul updated for
longindices - V128/V256/V512 support preserved
- Matrices >2GB now supported
Code Reduction
Default.Clip.cs: 914 → 240 lines (76% reduction)Default.MatMul.2D2D.cs: 19,862 → 284 lines (98.6% reduction)
Test Improvements
New Test Infrastructure
[LargeMemoryTest]attribute - Inherits from OpenBugs for CI exclusionTestMemoryTracker- Diagnose CI OOM failures- TUnit category exclusion - Proper CI filtering with
--treenode-filter
New Test Files (30+)
Type API Tests:
np.can_cast.BattleTest.csnp.promote_types.BattleTest.csnp.result_type.BattleTest.csnp.min_scalar_type.BattleTest.csnp.common_type.BattleTest.csnp.issubdtype.BattleTest.csnp.finfo.BattleTest.csnp.iinfo.BattleTest.csnp.isreal_iscomplex.BattleTest.csnp.type_checks.BattleTest.csnp.typing.Test.csNPTypeHierarchy.BattleTest.cs(74 tests)
Long Indexing Tests:
LongIndexingSmokeTest.cs- 96 np.* functions with 1M elementsLongIndexingBroadcastTest.cs- 2.36 billion element iterationsLongIndexingMasterTest.cs- Full 2.4GB array allocationsArgsortInt64Tests.csHashsetLongIndexingTests.csMatMulInt64Tests.csNonzeroInt64Tests.cs
Container Protocol Tests:
ContainerProtocolTests.cs- 69 basic testsContainerProtocolBattleTests.cs- Round 1 battle testsContainerProtocolBattleTests2.cs- 51 tests (round 2)ContainsNumPyAlignmentTests.cs
Comprehensive Tests:
ArgMaxArgMinComprehensiveTests.cs- 480 lines covering all dtypes, shapes, axesVarStdComprehensiveTests.cs- 462 lines covering ddof, empty arrays, edge casesCumSumComprehensiveTests.cs- 381 lines covering accumulation, overflow, dtypesnp_nonzero_strided_tests.cs- 221 lines for strided/transposed arraysNonContiguousTests.cs- 35+ tests for strided/broadcast arraysDtypeCoverageTests.cs- 26 parameterized tests for all 12 dtypesnp.comparison.Test.cs- Comparison function tests
Array Creation Tests:
np.arange.BattleTests.cs(50+ cases)np.array.BattleTests.csnp.ToString.BattleTests.cs
Other Tests:
TolistTests.csViewTests.cs
Test Counts
- Type introspection battle tests: 200+
- Container protocol tests: 120 (69 + 51)
- np.arange battle tests: 50+
- Type hierarchy tests: 74
- Contains battle tests: 50
- Long indexing smoke tests: 96 functions
- Linear algebra tests: 389 (dot: 195, matmul: 106, outer: 88)
- Fancy indexing tests: 20
- Scalar broadcast tests: 13
- Total new battle tests: 600+
- NumPy 2.x Int64 alignment: 71 tests fixed
- OpenBugs now passing: 74 tests enabled
- Total fixes: 145
- 5,020 tests in CI (+74 tests from fixed OpenBugs)
Platform Limitations (Cannot Fix)
These are .NET platform limitations, not NumSharp bugs:
Span<T>limited toint.MaxValueelements by .NET runtime. We introduced UnmanagedSpan<T> that has identical API to Span<T> with long support.List<T>.Countreturnsint(useLongCount()extension) but still the internal array can't exceed int.MaxValue.Hashset<T>.Countreturnsint(NumSharp addsLongCountproperty)- .NET managed arrays limited to
int.MaxValueelements - .NET string length limited to
int.MaxValuecharacters </details>
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages (26)
Showing the top 5 NuGet packages that depend on NumSharp:
| Package | Downloads |
|---|---|
|
Microsoft.Quantum.Simulators
Classical simulators of quantum computers for the Q# programming language. |
|
|
Microsoft.Quantum.Standard
Microsoft's Quantum standard libraries. |
|
|
Bigtree.Algorithm
Machine Learning library in .NET Core. |
|
|
Microsoft.Quantum.Standard.Visualization
Provides IQ# visualization support for Microsoft's Q# standard libraries. |
|
|
KokoroSharp
**Requires an ONNX Runtime package to function. KokoroSharp is an inference engine for Kokoro TTS with ONNX runtime, enabling fast and flexible local text-to-speech (fp/quanted) purely via C#. It features segment streaming, voice mixing, linear job scheduling, and optional playback. |
GitHub repositories (11)
Showing the top 11 popular GitHub repositories that depend on NumSharp:
| Repository | Stars |
|---|---|
|
openutau/OpenUtau
Open singing synthesis platform / Open source UTAU successor
|
|
|
kendryte/nncase
Open deep learning compiler stack for Kendryte AI accelerators ✨
|
|
|
SciSharp/SiaNet
An easy to use C# deep learning library with CUDA/OpenCL support
|
|
|
vocoder712/OpenUtauMobile
OpenUtau Mobile 是一个面向移动端的开源免费歌声合成软件; OpenUtau Mobile is a free and open-source singing voice synthesis software for mobile devices.
|
|
|
microsoft/qsharp-runtime
Runtime components for Q#
|
|
|
Lyrcaxis/KokoroSharp
Fast local TTS inference engine in C# with ONNX runtime. Multi-speaker, multi-platform and multilingual. Integrate on your .NET projects using a plug-and-play NuGet package, complete with all voices.
|
|
|
cassiebreviu/StableDiffusion
Inference Stable Diffusion with C# and ONNX Runtime
|
|
|
microsoft/Microsoft-Rocket-Video-Analytics-Platform
A highly extensible software stack to empower everyone to build practical real-world live video analytics applications for object detection and counting with cutting edge machine learning algorithms.
|
|
|
mobitouchOS/MaIN.NET
NuGet package designed to make LLMs, RAG, and Agents first-class citizens in .NET
|
|
|
SciSharp/Gym.NET
openai/gym's popular toolkit for developing and comparing reinforcement learning algorithms port to C#.
|
|
|
georg-jung/FaceAiSharp
State-of-the-art face detection and face recognition for .NET.
|
| Version | Downloads | Last Updated |
|---|---|---|
| 0.70.0 | 1,660 | 9/6/2026 |
| 0.60.0 | 7,341 | 6/28/2026 |
| 0.50.0-prerelease | 230 | 4/12/2026 |
| 0.41.0-prerelease | 220 | 3/23/2026 |
| 0.40.0-prerelease | 163 | 7/19/2026 |
| 0.30.0 | 4,004,689 | 2/14/2021 |
| 0.20.5 | 794,590 | 12/31/2019 |
| 0.20.4 | 359,001 | 10/5/2019 |
| 0.20.3 | 4,187 | 9/28/2019 |
| 0.20.2 | 2,988 | 9/11/2019 |
| 0.20.1 | 19,801 | 9/1/2019 |
| 0.20.0 | 4,924 | 8/20/2019 |
| 0.10.6 | 28,521 | 7/24/2019 |
| 0.10.5 | 3,387 | 7/22/2019 |