Bagaimana seseorang dapat dengan andal menentukan apakah suatu objek memiliki tipe numpy?
Saya menyadari bahwa pertanyaan ini bertentangan dengan filosofi mengetik bebek, tetapi idenya adalah untuk memastikan suatu fungsi (yang menggunakan scipy dan numpy) tidak pernah mengembalikan tipe numpy kecuali jika dipanggil dengan tipe numpy. Ini muncul dalam solusi untuk pertanyaan lain, tetapi saya pikir masalah umum untuk menentukan apakah suatu objek memiliki tipe numpy cukup jauh dari pertanyaan awal sehingga mereka harus dipisahkan.
python
numpy
duck-typing
dynamic-typing
Douglas B. Staple
sumber
sumber
Jawaban:
Gunakan
type
fungsi bawaan untuk mendapatkan tipe, lalu Anda dapat menggunakan__module__
properti untuk mencari tahu di mana ia didefinisikan:sumber
Solusi yang saya dapatkan adalah:
Namun, tidak 100% jelas bahwa semua jenis numpy dijamin salah satu
np.ndarray
ataunp.generic
, dan ini mungkin bukan versi yang kuat.sumber
dir(numpy)
jenis dan fungsi bawaan (dan kelas, tapi saya rasa tidak ada) dan menggunakannya untuk menghasilkan tupel untukisinstance
melawan, yang akan menjadi kuat. (Saya yakin Anda dapat meneruskan fungsi bawaan ke isinstance apakah mereka benar-benar tipe konstruktor atau tidak, tetapi Anda harus memeriksanya.)Pertanyaan lama tetapi saya mendapatkan jawaban pasti dengan sebuah contoh. Tidak ada salahnya untuk menjaga pertanyaan tetap segar karena saya memiliki masalah yang sama dan tidak menemukan jawaban yang jelas. Kuncinya adalah memastikan Anda telah
numpy
mengimpor, lalu menjalankanisinstance
bool. Meskipun ini mungkin tampak sederhana, jika Anda melakukan beberapa komputasi di berbagai tipe data, pemeriksaan kecil ini dapat berfungsi sebagai pengujian cepat sebelum Anda memulai beberapa operasi vektorisasi numpy.sumber
Itu sebenarnya tergantung pada apa yang Anda cari.
ndarray
, aisinstance(..., np.ndarray)
mungkin adalah yang termudah. Pastikan Anda tidak memuat ulang numpy di latar belakang karena modulnya mungkin berbeda, tetapi sebaliknya, Anda akan baik-baik saja.MaskedArrays
,matrix
,recarray
Semua subclass darindarray
, sehingga Anda harus ditetapkan.shape
dandtype
atribut. Anda dapat membandingkannya dengandtype
dtypes dasar, yang daftarnya dapat Anda temukan dinp.core.numerictypes.genericTypeRank
. Perhatikan bahwa elemen dari daftar ini adalah string, jadi Anda harus melakukantested.dtype is np.dtype(an_element_of_the_list)
...sumber
numpy
tipe", dan dapat mendefinisikan apa itu sesuatu, ini lebih baik daripada jawaban lainnya. Dan dalam banyak kasus, Anda harus mencari sesuatu yang spesifik yang dapat Anda definisikan.Untuk mendapatkan tipenya, gunakan
type
fungsi builtin . Denganin
operator, Anda dapat menguji apakah tipe tersebut adalah tipe numpy dengan memeriksa apakah itu berisi stringnumpy
;(Contoh ini dijalankan di IPython . Sangat berguna untuk penggunaan interaktif dan tes cepat.)
sumber
Perhatikan bahwa
type(numpy.ndarray)
is atype
itu sendiri dan hati-hati terhadap jenis boolean dan skalar. Jangan terlalu putus asa jika tidak intuitif atau mudah, ini menyakitkan pada awalnya.Lihat juga: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.dtypes.html - https://github.com/machinalis/mypy-data/tree/master/numpy- mypy
Bersenang-senang dengan boolean:
Lebih asyik dengan jenis skalar, lihat: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.scalars.html#arrays-scalars-built-in
sumber