Ini mungkin bukan pertanyaan implementasi, dan lebih ke pertanyaan "filosofi", tetapi bukankah Norma Frobenius harus bekerja pada Vektor? Sumber: Wolfram
Saat ini, Norma Frobenius di numpy tidak menerima vektor:
import numpy as np
a = np.random.rand(10, 1)
b = np.squeeze(a)
print(np.linalg.norm(a, 'fro'))
print(np.linalg.norm(b, 'fro'))
Yang mengakibatkan:
1.7594677278427366
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
//anaconda3/lib/python3.7/site-packages/numpy/linalg/linalg.py in norm(x, ord, axis, keepdims)
2515 try:
-> 2516 ord + 1
2517 except TypeError:
TypeError: can only concatenate str (not "int") to str
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
<ipython-input-18-2ace847024a5> in <module>
3 b = np.squeeze(a)
4 print(np.linalg.norm(a, 'fro'))
----> 5 print(np.linalg.norm(b, 'fro'))
<__array_function__ internals> in norm(*args, **kwargs)
//anaconda3/lib/python3.7/site-packages/numpy/linalg/linalg.py in norm(x, ord, axis, keepdims)
2516 ord + 1
2517 except TypeError:
-> 2518 raise ValueError("Invalid norm order for vectors.")
2519 absx = abs(x)
2520 absx **= ord
ValueError: Invalid norm order for vectors.
Ini terlihat seperti bug dalam menangani 'fro'
kwarg:
>>> print(np.linalg.norm(b))
1.7547099704258247
Perhatikan bahwa norma Frobenius adalah default ketika kwarg ord
adalah None.
xref gh-14719 dan gh-14215: Kami berpikir untuk menghentikan kasus umum, tetapi kemudian tidak pernah melanjutkan karena meskipun tidak ada perlawanan besar, ada beberapa. Dan beberapa paket lain mendefinisikannya seperti itu. Jadi masalahnya adalah memutuskan ke mana tepatnya harus pergi ke sini ...
Seperti yang ditunjukkan Ross kepada saya, masalah/PR yang saya tautkan hanya terkait secara tangensial dan ini jelas merupakan bug dalam penanganan "fro"
.
PR untuk mengatasi bug dalam penanganan kwarg (dan tes yang menyertainya) diterima! Tangkapan bagus @TNonet
Karena ini adalah masalah pertama saya, Apakah ada sumber daya untuk membuat tes yang tepat dan permintaan tarik?
(Juga, jika saya ingin mengkloning repo numpy dan menjalankan setup.py, bagaimana saya memastikan versi numpy mana yang saya gunakan ketika saya mengimpor numpy?)
Saya berpendapat jika ord adalah 'maju', maka baris 2512-14 di bawah.
Perlu diubah menjadi:
if ((ord is None) or
(ord in ('f', 'fro')) or
(ord == 2 and ndim == 1)):
Dengan asumsi semua orang setuju bahwa array urutan ke-n memiliki Norma Forbenious yang secara alami menjumlahkan kuadrat dari setiap elemen.
Masalahnya sebenarnya sedikit lebih jauh di dalam kode - jika Anda mengikuti penelusuran kembali dari kesalahan yang Anda terima semula, Anda seharusnya dapat menemukan bit yang menyinggung.
Seperti disebutkan dalam diskusi di #14719 dan #14215, perilaku untuk >2 dimensi adalah masalah terpisah - akan lebih baik jika Anda dapat membatasi PR ini pada bug dalam penanganan kwarg.
Re: sumber daya untuk pengujian/kontribusi: lihat pedoman kontribusi NumPy . Anda juga dapat melihat pengujian linalg di numpy/linalg/tests/test_linalg.py
untuk mendapatkan gambaran tentang bagaimana pengujian diformulasikan dan di mana pengujian tambahan mungkin sesuai. Semoga membantu!
Komentar yang paling membantu
Masalahnya sebenarnya sedikit lebih jauh di dalam kode - jika Anda mengikuti penelusuran kembali dari kesalahan yang Anda terima semula, Anda seharusnya dapat menemukan bit yang menyinggung.
Seperti disebutkan dalam diskusi di #14719 dan #14215, perilaku untuk >2 dimensi adalah masalah terpisah - akan lebih baik jika Anda dapat membatasi PR ini pada bug dalam penanganan kwarg.
Re: sumber daya untuk pengujian/kontribusi: lihat pedoman kontribusi NumPy . Anda juga dapat melihat pengujian linalg di
numpy/linalg/tests/test_linalg.py
untuk mendapatkan gambaran tentang bagaimana pengujian diformulasikan dan di mana pengujian tambahan mungkin sesuai. Semoga membantu!