Sesuai dengan "Hanya ada satu cara yang jelas untuk melakukannya", bagaimana Anda mendapatkan besarnya vektor (array 1D) di Numpy?
def mag(x):
return math.sqrt(sum(i**2 for i in x))
Di atas berfungsi, tetapi saya tidak percaya bahwa saya harus menentukan sendiri fungsi sepele dan inti itu.
linalg.norm
seperti yang disebutkan di bawah ini. Tetapi sedikit lebih sederhana dari pada lambda Anda, tanpa perlu impor, hanyasum(x*x)**0.5
def
ketika mendeklarasikan fungsi seperti itu? Saya pikir jika itu sah satu baris, itu membuatnya lebih mudah dibaca.Jawaban:
Fungsi yang Anda cari adalah
numpy.linalg.norm
. (Saya rasa itu harus di dasar numpy sebagai properti dari array - katakanx.norm()
- tapi oh well).Anda juga dapat memberi makan dalam opsional
ord
untuk norma urutan ke-n yang Anda inginkan. Katakanlah Anda menginginkan 1-norma:Dan seterusnya.
sumber
Matrix.randn([5,5])
np.linalg.norm
sekarang memilikiaxis
argumen baru , dibahas di sini: stackoverflow.com/a/19794741/1959808Jika Anda khawatir tentang kecepatan, Anda sebaiknya menggunakan:
Inilah beberapa tolok ukur:
EDIT: Peningkatan kecepatan nyata terjadi ketika Anda harus mengambil norma banyak vektor. Menggunakan fungsi numpy murni tidak memerlukan loop. Sebagai contoh:
sumber
np.linalg.norm
adalah hambatan, tetapi kemudian saya melangkah lebih jauh dan hanya menggunakanmath.sqrt(x[0]**2 + x[1]**2)
yang merupakan peningkatan signifikan lainnya.numpy.linalg.norm
berisi perlindungan terhadap overflow yang dilewati oleh implementasi ini. Misalnya, coba hitung norma[1e200, 1e200]
. Ada alasan jika lebih lambat ...inf
saat komputasinp.linalg.norm([1e200,1e200])
.Namun alternatif lain adalah menggunakan
einsum
fungsi numpy untuk kedua array:atau vektor:
Namun, sepertinya ada beberapa overhead yang terkait dengan memanggilnya yang mungkin membuatnya lebih lambat dengan input kecil:
sumber
numpy.linalg.norm
berisi perlindungan terhadap overflow yang dilewati oleh implementasi ini. Misalnya, coba hitung norma[1e200, 1e200]
. Ada alasan jika lebih lambat ...Cara tercepat yang saya temukan adalah melalui inner1d. Berikut ini perbandingannya dengan metode numpy lainnya:
inner1d ~ 3x lebih cepat dari linalg.norm dan rambut lebih cepat dari einsum
sumber
linalg.norm
adalah yang tercepat karena 9 panggilan dalam 29ms jadi 1 panggilan dalam 3,222ms vs 1 panggilan dalam 4,5ms untukinner1d
.((10**8,3,))
dan kemudian jalankan secara manualnp.linalg.norm(V,axis=1)
diikuti olehnp.sqrt(inner1d(V,V))
, Anda akan melihatlinalg.norm
akan ketinggalan dibandingkan dengan inner1dnumpy.linalg.norm
berisi perlindungan terhadap overflow yang dilewati oleh implementasi ini. Misalnya, coba hitung norma[1e200, 1e200]
. Ada alasan jika lebih lambat ...gunakan norma fungsi di scipy.linalg (atau numpy.linalg )
sumber
Anda dapat melakukan ini secara ringkas menggunakan toolbelt vg . Ini adalah lapisan ringan di atas numpy dan mendukung nilai tunggal dan vektor ditumpuk.
Saya membuat perpustakaan di startup terakhir saya, yang dimotivasi oleh penggunaan seperti ini: ide-ide sederhana yang terlalu bertele-tele di NumPy.
sumber