SciPy tampaknya menyediakan sebagian besar (tetapi tidak semua [1]) fungsi NumPy dalam ruang namanya sendiri. Dengan kata lain, jika ada fungsi bernama numpy.foo
, hampir pasti ada ascipy.foo
. Sebagian besar waktu, keduanya tampak persis sama, seringkali bahkan menunjuk ke objek fungsi yang sama.
Terkadang, mereka berbeda. Untuk memberikan contoh yang muncul baru-baru ini:
numpy.log10
adalah ufunc yang mengembalikan NaNs untuk argumen negatif;scipy.log10
mengembalikan nilai kompleks untuk argumen negatif dan sepertinya bukan ufunc.
Hal yang sama dapat dikatakan tentang log
, log2
dan logn
, tetapi bukan tentanglog1p
[2].
Di sisi lain, numpy.exp
dan scipy.exp
tampaknya nama yang berbeda untuk ufunc yang sama. Ini juga berlaku untuk scipy.log1p
dannumpy.log1p
.
Contoh lain adalah numpy.linalg.solve
vs.scipy.linalg.solve
. Mereka serupa, tetapi yang terakhir menawarkan beberapa fitur tambahan di atas yang pertama.
Mengapa duplikasi yang jelas? Jika ini dimaksudkan sebagai impor grosir numpy
ke scipy
namespace, mengapa perbedaan yang halus dalam perilaku dan fungsi yang hilang? Apakah ada logika menyeluruh yang akan membantu menjernihkan kebingungan?
[1] numpy.min
, numpy.max
, numpy.abs
dan beberapa orang lainnya tidak memiliki rekan-rekan discipy
namespace.
[2] Diuji menggunakan NumPy 1.5.1 dan SciPy 0.9.0rc2.
all of those functions are available without additionally importing Numpy
karenathe intention is for users not to have to know the distinction between the scipy and numpy namespaces
. Sekarang saya bertanya-tanya, karena saya mengikuti postingan tentang numpy dan scipy sedikit dan menggunakannya sendiri. Dan saya hampir selalu melihat numpy diimpor secara terpisah (seperti np). Jadi mereka gagal?Jawaban:
Terakhir kali saya memeriksanya,
__init__
metode scipy mengeksekusi asehingga seluruh namespace numpy dimasukkan ke dalam scipy ketika modul scipy diimpor.
The
log10
perilaku yang Anda gambarkan adalah menarik, karena kedua versi berasal dari numpy. Satu adalah aufunc
, yang lain adalahnumpy.lib
fungsi. Mengapa Scipy lebih memilih fungsi perpustakaan daripadaufunc
, saya tidak tahu dari atas kepala saya.EDIT: Sebenarnya, saya bisa menjawab
log10
pertanyaan itu. Melihat dalam__init__
metode scipy saya melihat ini:The
log10
Fungsi Anda dapatkan di scipy berasal darinumpy.lib.scimath
. Melihat kode itu, tertulis:Tampaknya modul overlay yang ufuncs dasar numpy untuk
sqrt
,log
,log2
,logn
,log10
,power
,arccos
,arcsin
, danarctanh
. Itu menjelaskan perilaku yang Anda lihat. Alasan desain yang mendasari mengapa hal itu dilakukan seperti itu mungkin dimakamkan di pos milis di suatu tempat.sumber
Dari Panduan Referensi SciPy:
Tujuannya adalah agar pengguna tidak harus mengetahui perbedaan antara ruang nama
scipy
dannumpy
ruang nama, meskipun tampaknya Anda telah menemukan pengecualian.sumber
Tampaknya dari FAQ SciPy bahwa beberapa fungsi dari NumPy ada di sini karena alasan historis sementara itu hanya harus dalam SciPy:
Itu menjelaskan mengapa
scipy.linalg.solve
menawarkan beberapa fitur tambahannumpy.linalg.solve
.Saya tidak melihat jawaban SethMMorton untuk pertanyaan terkait
sumber
Ada komentar singkat di akhir pengantar dokumentasi SciPy :
Saya pikir ini akan memungkinkan seseorang dengan pengetahuan yang cukup tentang semua paket yang terlibat untuk memisahkan apa perbedaan antara beberapa fungsi scipy dan numpy (tidak membantu saya dengan pertanyaan log10 sama sekali). Saya benar-benar tidak memiliki pengetahuan itu tetapi
source
menunjukkan hal ituscipy.linalg.solve
dannumpy.linalg.solve
berinteraksi dengan Lapack dengan cara yang berbeda;Ini juga posting pertama saya jadi jika saya harus mengubah sesuatu di sini, beri tahu saya.
sumber
Dari Wikipedia ( http://en.wikipedia.org/wiki/NumPy#History ):
scipy
bergantung padanumpy
dan mengimpor banyaknumpy
fungsi ke dalam namespace-nya untuk kenyamanan.sumber
Mengenai paket linalg - fungsi cipy akan memanggil lapack dan blas, yang tersedia dalam versi yang sangat dioptimalkan pada banyak platform dan menawarkan kinerja yang sangat baik, terutama untuk operasi pada matriks padat yang cukup besar. Di sisi lain, mereka bukanlah perpustakaan yang mudah dikompilasi, membutuhkan fortran compiler dan banyak penyesuaian platform khusus untuk mendapatkan kinerja penuh. Oleh karena itu, numpy menyediakan implementasi sederhana dari banyak fungsi aljabar linear umum yang seringkali cukup baik untuk banyak tujuan.
sumber
dual
: "Modul ini harus digunakan untuk fungsi baik di numpy dan scipy jika Anda ingin menggunakan versi numpy jika tersedia tetapi versi cipy sebaliknya." Penggunaan ---from numpy.dual import fft, inv
Dari Ceramah tentang ' Ekonomi Kuantitatif '
SciPy adalah paket yang berisi berbagai alat yang dibangun di atas NumPy, menggunakan tipe data lariknya dan fungsionalitas terkait
Bahkan, ketika kita mengimpor SciPy kita juga mendapatkan NumPy, seperti yang dapat dilihat dari file inisialisasi SciPy
Namun, itu lebih umum dan praktik yang lebih baik untuk menggunakan fungsi NumPy secara eksplisit
Apa yang berguna dalam SciPy adalah fungsionalitas dalam sub-paketnya
sumber
Selain itu FAQ SciPy yang menjelaskan duplikasi ini terutama untuk kompatibilitas mundur, selanjutnya dijelaskan dalam dokumentasi NumPy untuk mengatakan bahwa
Untuk singkatnya, ini adalah:
Juga, dari Tutorial SciPy :
Jadi, untuk aplikasi baru, Anda harus memilih versi NumPy dari operasi array yang diduplikasi di tingkat atas SciPy. Untuk domain yang tercantum di atas, Anda harus memilih yang ada di SciPy dan memeriksa kompatibilitas jika perlu di NumPy.
Dalam pengalaman pribadi saya, sebagian besar fungsi array yang saya gunakan ada di tingkat atas NumPy (kecuali untuk
random
). Namun, semua rutinitas khusus domain ada di subpackages SciPy, jadi saya jarang menggunakan apa pun dari tingkat atas SciPy.sumber