Tensor boyutları, depolama ve NumPy farklılıkları

System.Numerics.Tensors paketi, çok boyutlu veriler için TensorSpan<T>, ReadOnlyTensorSpan<T> ve Tensor<T> sağlar. Tensor şekilleri mantıksal boyutları açıklar; stride'lar, her boyut boyunca ardışık konumlar arasındaki mesafeyi öğeler cinsinden tanımlar.

Burada açıklanan davranış, paketle birlikte, desteklediği tüm hedef çerçevelerde sunulur. Paketin güncelleştirilmesi, önceki .NET sürümleri hedefleyen uygulamaları etkileyebilir.

Bu türler NumPy ile birçok kuralı paylaşır, ancak birbirinin yerine kullanılamaz. Bir algoritmayı taşıma sırasında aşağıdaki farkları hesaba katın.

Boş şekiller ve skaler benzeri sonuçlar

Arka planda veri olmadan boş bir şekilden ([]) tensor oluşturduğunuzda, tensorun şekli [0] olur ve öğe yoktur. NumPy'de şekil () sıfır rankine sahiptir ve bir skaler öğe içerir. Özellikle, np.empty(()) değeri başlatılmamış bir skaler ayırır; "boş" hiçbir öğesi olmadığı anlamına gelmez.

Buna karşılık, var olan veriler üzerinde tensor-span oluşturucusunda uzunlukları atladığınızda, oluşturucu sağlanan diziden veya span'dan tek boyutlu bir şekil belirler.

Şekli [1, 1] olan bir tensörü sıktığınızda sonuç, NumPy'nin sıfır dereceli şekli [1] değil, () şekline sahiptir. Her iki sonuç da bir öğe içerir ve skaler olarak yayın yapılabilir, ancak rank'i inceleyen, eksenleri seçen veya sonucu dizinleyen kod, korunan boyutu dikkate almalıdır.

Stride'lar atlandığında, sıfır uzunluklu boyut içeren herhangi bir şeklin her boyutta stride değeri sıfırdır. Öğe sayısı ve gerekli depolama alanı, diğer boyut uzunluklarından bağımsız olarak sıfırdır. Negatif uzunluklar geçersiz olmaya devam eder. Açık stride değerleri yine de düzen doğrulamasını karşılamalıdır.

Adımlar ve ters çevrilmiş veriler

Adımlar negatif olmamalıdır. NumPy, negatif bir adımla ters çevrilmiş bir görünümü temsil edebilir, örneğin array[::-1].

İlk ekseni ters çevirmek için boyut Tensor.ReverseDimension ile 0 çağrısı yapın:

using System.Numerics.Tensors;

Tensor<int> source = Tensor.Create(new[] { 1, 2, 3, 4 }, new nint[] { 2, 2 });
Tensor<int> reversed = Tensor.ReverseDimension<int>(source.AsReadOnlyTensorSpan(), 0);

reversed mantıksal öğeleri [3, 4, 1, 2] öğeleridir. Ayıran aşırı yükleme yeni bir tensor üretir; özgün depolama alanı üzerinde negatif adımlı bir görünüm değildir.

Tensor'u yeniden boyutlandırın

Tensor.Resize ve Tensor.ResizeTo, default(T) ile eklenen mantıksal öğeleri doldurun. Örneğin, [1, 2] öğesini beş [1, 2, 0, 0, 0] öğeye büyütürseniz sonuç int içerir. NumPy'nin np.resize bunun yerine girişi yineler ve [1, 2, 1, 2, 1] üretir.

Hedef daha küçükse, işlem hedefin mantıksal öğe sayısından sonraki öğeleri atar. Daha büyükse, hedef öğeler arasında boşluklar olsa bile işlem kalan mantıksal hedef öğelerini başlatır. Mantıksal hedef dışındaki depolama alanı yeniden boyutlandırma işleminin bir parçası değildir.

Tensor.ResizeTo ve mevcut bir hedefte birleştirme, birden fazla mantıksal öğe içeren sıfır adımlı bir boyutu reddeder. Böyle bir boyut birden çok çıkış pozisyonunun aynı depolama alanına başvurmasına neden olur ve ayrı çıkış değerlerini barındıramaz. Tekil boyutlardaki sıfır adımlar ve boş hedefler bu çakışmayı oluşturmaz.

Çakışan kaynaklar ve hedefler

Ayrı tensor nesneleri ve span'ları aynı dizinin çakışan bölgelerine başvurabilir. Desteklenen durumlar hem işleme hem de düzene bağlıdır:

Operasyon Desteklenen örtüşme
CopyTo ve TryCopyTo Yoğun kaynak ve hedef, eşit öğe sayılarına veya tam olarak aynı görünümlere sahiptir. Yoğun kopyalar, çakışma güvenli span kopyalamayı kullanır.
FlattenTo ve TryFlattenTo Yoğun bir kaynak ve hedef aralığı.
Hedefle öğe düzeyinde işlemler Görünümün yinelenen mantıksal depolama konumları olmaması koşuluyla, aynı başlangıç referansı, uzunluklar ve adımlara sahip bir giriş ve çıkış vardır. Her giriş bağımsız olarak denetlenmektedir.
Tensor.ResizeTo Yoğun kaynak ve hedef. Desteklenmeyen strided overlap reddedilir.
Aynı görünümde tersine çevirme Sık görünüm yerinde tersine çevrilebilir. No-op geri almalar da desteklenir.

Diğer desteklenmeyen örtüşen düzenler, işlem çıktı yazmadan önce ArgumentException oluşturur. Yoğun tensor tek başına her işlem için destek garantisi vermez: örneğin, bir kopya için kaydırılmış yoğun hedef desteklenir, ancak öğe tabanlı işlem için desteklenmez.

TryCopyTo ve TryFlattenTo yöntemleri, hedef çok kısa olduğunda kopyalamadan false döndürür. TryCopyTo ayrıca uyumsuz kaynak ve hedef şekilleri için false döndürür. Yeterli hedef kapasiteye sahip uyumlu şekiller için, bu yöntemler desteklenmeyen çakışma için yine de özel durum fırlatabilir; Try geçersiz düzen özel durumlarını gizlemez.

Örneğin, aşağıdaki adımlı kaynak ve adımsız hedef çakışması:

int[] storage = { 1, 2, 3, 4, 5, 6 };
ReadOnlyTensorSpan<int> source = new(storage, new nint[] { 2, 2 }, new nint[] { 3, 1 });
TensorSpan<int> destination = new(storage, new nint[] { 2, 2 });

Bu desteklenmeyen çakışan düzenden kopyalamak için önce bağımsız depolama alanına bir snapshot alın:

int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);

Anlık görüntü [1, 2, 4, 5] içerir. Kopya, özgün değerleri okunmadan önce değiştirmeden bu öğeleri hedefe yazar.

Hedef bağımsız değişkeni alan öğe düzeyinde bir işlem için, çıktıyı yazmadan önce ayrı bir sonuç tensörü ayırın veya çakışan her girdinin anlık görüntüsünü alın. Yinelenen depolama konumları olan bir yayın hedefi için bunun yerine bağımsız çıkış depolama alanı kullanın; giriş anlık görüntüsü, bu hedefin farklı değerler tutabilme özelliğine sahip olmasını sağlamaz.

Kitaplık, rastgele örtüşen düzenleri desteklemek için örtük olarak tam tensor anlık görüntüsü ayırmaz. Çakışmayan adımlı kopyalarda geçici depolama gerekmez.

Ayrıca bkz.