Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Paket System.Numerics.Tensors menyediakan Tensor<T>, TensorSpan<T>, dan ReadOnlyTensorSpan<T> untuk data multidmensional. Bentuk tensor menjelaskan dimensi logis; stride menggambarkan jarak, dalam elemen, antara posisi berturut-turut di sepanjang setiap dimensi.
Perilaku yang dijelaskan di sini disertakan dalam paket untuk semua kerangka kerja target yang didukung. Memperbarui paket dapat memengaruhi aplikasi yang menargetkan versi .NET sebelumnya.
Jenis-jenis ini berbagi banyak konvensi dengan NumPy, tetapi tidak dapat dipertukarkan. Perhitungkan perbedaan berikut saat Anda mentransfer algoritma.
shape kosong dan hasil mirip skalar
Saat Anda membuat tensor dari bentuk kosong ([]) tanpa data pendukung, tensor memiliki bentuk [0] dan tidak ada elemen. Di NumPy, bentuk () memiliki peringkat nol dan berisi satu elemen skalar. Secara khusus, np.empty(()) mengalokasikan skalar dengan nilai yang tidak diinisialisasi; "kosong" tidak berarti tidak memiliki elemen.
Sebaliknya, ketika Anda menghilangkan panjang dari konstruktor tensor-span atas data yang ada, konstruktor menyimpulkan bentuk satu dimensi dari array atau rentang yang disediakan.
Saat Anda melakukan squeeze pada tensor dengan bentuk [1, 1], hasilnya memiliki bentuk [1], bukan bentuk berperingkat nol NumPy (). Kedua hasil berisi satu elemen dan dapat dibroadcast sebagai skalar, tetapi kode yang memeriksa rank, memilih sumbu, atau mengindeks hasil harus memperhitungkan dimensi yang dipertahankan.
Ketika stride dihilangkan, bentuk apa pun yang berisi dimensi panjang nol memiliki nol stride di setiap dimensi. Jumlah elemen dan penyimpanan yang diperlukan adalah nol, terlepas dari panjang dimensi lainnya. Panjang negatif tetap tidak valid. Langkah eksplisit harus tetap memenuhi validasi tata letak.
Stride dan data terbalik
Strides harus tidak negatif. NumPy dapat mewakili tampilan terbalik dengan stride negatif, misalnya array[::-1].
Untuk membalikkan sumbu pertama, panggil Tensor.ReverseDimension dengan dimensi 0:
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);
Elemen logis dari reversed adalah [3, 4, 1, 2]. Overload yang mengalokasikan menghasilkan tensor baru; ini bukan tampilan negative-stride atas penyimpanan asli.
Mengubah ukuran tensor
Tensor.Resize dan Tensor.ResizeTo isi elemen logis tambahan dengan default(T). Misalnya, jika Anda menambah [1, 2] menjadi lima elemen int, hasilnya berisi [1, 2, 0, 0, 0]. NumPy justru np.resize mengulangi input dan menghasilkan [1, 2, 1, 2, 1].
Jika tujuan lebih kecil, operasi akan membuang elemen setelah jumlah elemen logis pada tujuan. Jika lebih besar, operasi menginisialisasi elemen tujuan logis yang tersisa bahkan ketika tujuan memiliki kesenjangan di antara elemen. Penyimpanan di luar tujuan logis bukan bagian dari operasi pengubahan ukuran.
Tensor.ResizeTo dan konkatenasi ke dalam tujuan yang ada menolak dimensi zero-stride yang berisi lebih dari satu elemen logis. Dimensi seperti itu menyebabkan beberapa posisi output merujuk ke penyimpanan yang sama dan tidak dapat menyimpan nilai output yang berbeda. Stride nol dalam dimensi singleton dan tujuan kosong tidak membuat konflik ini.
Sumber dan tujuan yang tumpang tindih
Objek tensor dan span tensor yang terpisah dapat merujuk ke wilayah yang tumpang tindih dari array yang sama. Kasus yang didukung bergantung pada operasi dan tata letak:
| Operasi | Mendukung tumpang tindih |
|---|---|
CopyTo dan TryCopyTo |
Sumber dan tujuan padat dengan jumlah elemen yang sama, atau tampilan yang persis identik. Dense copies menggunakan penyalinan rentang yang aman untuk tumpang tindih. |
FlattenTo dan TryFlattenTo |
Sumber yang rapat dan rentang tujuan. |
| Operasi Elementwise dengan destinasi | Sebuah input dan output dengan referensi awal, panjang, dan langkah yang sama, asalkan tampilan tidak memiliki lokasi penyimpanan logis berulang. Setiap input diperiksa secara independen. |
Tensor.ResizeTo |
Sumber dan tujuan padat. Tumpang tindih berstrida yang tidak didukung ditolak. |
| Kembali ke tampilan yang sama | Tampilan padat dapat dibalik secara langsung. Pembalikan no-op juga didukung. |
Tata letak tumpang tindih lain yang tidak didukung memunculkan ArgumentException sebelum operasi menulis output. Tensor padat saja tidak menjamin dukungan untuk setiap operasi: misalnya, destinasi padat yang digeser didukung untuk salinan, tetapi tidak untuk operasi elementwise.
Metode TryCopyTo dan TryFlattenTo mengembalikan false tanpa menyalin ketika tujuan terlalu pendek.
TryCopyTo juga mengembalikan false untuk bentuk sumber dan tujuan yang tidak kompatibel. Untuk bentuk yang kompatibel dengan kapasitas tujuan yang memadai, metode ini masih dapat menimbulkan pengecualian untuk tumpang tindih yang tidak didukung; Try tidak mencegah pengecualian tata letak yang tidak valid.
Misalnya, sumber ber-stride berikut dan tujuan dense tumpang tindih:
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 });
Untuk menyalin dari tata letak tumpang tindih yang tidak didukung ini, pertama-tama ambil snapshot ke penyimpanan independen:
int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);
Cuplikan berisi [1, 2, 4, 5]. Proses penyalinan menulis elemen-elemen tersebut ke tujuan tanpa mengubah nilai asli sebelum nilai asli tersebut dibaca.
Untuk operasi elementwise yang menerima tensor tujuan, alokasikan tensor hasil terpisah atau snapshot setiap input yang tumpang tindih sebelum Anda menulis output. Untuk tujuan broadcast dengan lokasi penyimpanan berulang, gunakan penyimpanan output independen sebagai gantinya; snapshot input tidak membuat tujuan tersebut mampu menyimpan nilai yang berbeda.
Library tidak secara implisit mengalokasikan snapshot tensor penuh untuk mendukung tata letak yang tumpang tindih arbitrer. Salinan berstride yang tidak tumpang tindih tidak memerlukan penyimpanan sementara tersebut.