Numpy: np.copy (masked array) memiliki perilaku yang tidak terduga

Dibuat pada 26 Jun 2013  ·  11Komentar  ·  Sumber: numpy/numpy

.... di mana "tidak terduga" berarti _I_ tidak mengharapkannya. Ini mungkin hanya perbaikan dokumentasi, atau mungkin saya akan dimarahi karena tidak menyadari cara kerja np.ma , tetapi menurut saya perilaku ini tidak pantas:

In [100]: x = np.ma.ones(5)

In [101]: x.mask = [False,False,True,False,False]

In [102]: np.copy(x)
Out[102]: array([ 1.,  1.,  1.,  1.,  1.])

In [103]: np.ma.copy(x)
Out[103]:
masked_array(data = [1.0 1.0 -- 1.0 1.0],
             mask = [False False  True False False],
       fill_value = 1e+20)

In [104]: np.__version__
Out[104]: '1.8.0.dev-074a40c'

Setidaknya saya mengharapkan peringatan, tetapi lebih suka melihat, dalam urutan preferensi:

  • np.copy(x) mengembalikan array bertopeng (karena x adalah array bertopeng)
  • np.copy(x) memperingatkan bahwa ia membuka kedok array, lalu mengembalikan array yang sama seperti di atas
  • np.copy(x) memunculkan pengecualian
  • np.copy(x) mengembalikan [1,1,nan,1,1] (ini mungkin tidak ideal)
00 - Bug numpy.lib

Semua 11 komentar

Masih terbuka di 1.9-devel

Tidak yakin bagaimana cara memperbaikinya tanpa array bertopeng casing khusus.

Akankah mengubah logika np.copy untuk menyertakan subok=True dalam panggilan ke array akan memperbaiki masalah ini?
Dari:

return array(a, order=order, copy=True)

Untuk:

return array(a, order=order, subok=True, copy=True)

Jika demikian, haruskah subok menjadi parameter ke np.copy dan apa defaultnya, True atau False? True akan mengembalikan hasil pilihan pertama, False akan mempertahankan perilaku saat ini, tetapi mengizinkan perilaku yang diharapkan tetapi menambahkan argumen.

Saya tidak mendukung menambahkan parameter subok ke np.copy ketika kita sudah memiliki dua solusi yang sepenuhnya layak:

  • gunakan metode .copy()
  • gunakan np.array(a, subok=True) (disalin secara default)

Saya sebenarnya berpendapat sebaliknya, karena menurut saya kebanyakan "salinan" memberi kesan bahwa seseorang akan mendapatkan sesuatu kembali yang sebenarnya adalah salinan, dan dengan demikian dari jenis yang sama. Saya juga melihatnya sebagai kontribusi kecil tapi berguna untuk membuat keseluruhan numpy lebih konsisten dalam menangani subclass (seperti yang saya lakukan sebelumnya dengan np.broadcast_arrays , di mana tidak ada pengganti yang baik tersedia). Namun, mengingat kebutuhan untuk tetap kompatibel ke belakang, saya pikir kami terjebak dengan default subok=False .

Ngomong-ngomong, @jjhelmus , kenapa tidak membuat PR cepat dan lihat apa yang dipikirkan orang lain?

@ shoyer : np.copy mungkin harus masuk ke daftar fungsi yang Anda butuhkan
beberapa jenis dukungan bebek array, meskipun - untuk array bebek saya pikir np.copy
dan np.array mungkin harus melakukan hal yang berbeda. Mungkin sebaiknya telepon saja
arr.copy?

Pada hari Kamis, 15 Okt 2015 jam 07.00, Marten van Kerkwijk <
[email protected]> menulis:

Saya sebenarnya akan membantah yang sebaliknya, karena saya pikir kebanyakan "salinan" memberi
kesan bahwa seseorang akan mendapatkan kembali sesuatu yang sebenarnya adalah salinan,
dan dengan demikian dari tipe yang sama. Saya juga melihatnya sebagai sumbangan kecil tapi bermanfaat
untuk membuat seluruh numpy lebih konsisten dalam menangani subclass
(seperti yang saya lakukan sebelumnya dengan np.broadcast_arrays, di mana tidak ada pengganti yang baik
tersedia). Namun, mengingat kebutuhan untuk tetap kompatibel ke belakang, saya
memang berpikir kita terjebak dengan default subok = False.

Ngomong-ngomong, @jjhelmus https://github.com/jjhelmus , kenapa tidak bikin PR cepat
dan lihat apa yang orang lain pikirkan?

-
Balas email ini secara langsung atau lihat di GitHub
https://github.com/numpy/numpy/issues/3474#issuecomment -148395201.

Nathaniel J. Smith - http://vorpus.org

Ya, saya akan memberi +1 saat membuat np.copy coba panggil metode salin pada array bebek.

Masih tidak ada alasan untuk tidak mendukung subok juga. Dan tentu saja seseorang dapat memanggil __copy__ jika ada.

Membuat PR # 6509 yang menambahkan parameter subok ke fungsi dengan nilai default False . Saya rasa ini akan membuka beberapa diskusi tentang topik tersebut. Tidak yakin apakah ini biasanya terjadi pada PR, masalah, atau milis.

Diskusi api harus ada di milis.
Pada 18 Okt 2015 19.37, "Jonathan J. Helmus" [email protected]
menulis:

Membuat PR # 6509 https://github.com/numpy/numpy/pull/6509 yang menambahkan file
_subok_ ke fungsi dengan nilai default _False_. Aku
menebak ini akan membuka beberapa diskusi tentang topik tersebut. Tidak yakin jika ini
biasanya terjadi di PR, masalah, atau milis.

-
Balas email ini secara langsung atau lihat di GitHub
https://github.com/numpy/numpy/issues/3474#issuecomment -149080511.

Saya akan mengirim email ke daftar tentang topik besok.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

Foadsf picture Foadsf  ·  3Komentar

toddrjen picture toddrjen  ·  4Komentar

amuresan picture amuresan  ·  4Komentar

keithbriggs picture keithbriggs  ·  3Komentar

kevinzhai80 picture kevinzhai80  ·  4Komentar