Apa perbedaan antara fungsi array Numpy () dan asarray ()?

298

Apa perbedaan antara Numpy array()dan asarray()fungsinya? Kapan Anda harus menggunakan yang satu daripada yang lain? Mereka tampaknya menghasilkan output yang identik untuk semua input yang dapat saya pikirkan.

Benjamin Hodgson
sumber

Jawaban:

110

Karena pertanyaan lain sedang dialihkan ke pertanyaan yang menanyakan asanyarrayatau rutinitas pembuatan array lainnya , mungkin layak untuk memiliki ringkasan singkat tentang apa yang masing-masing lakukan.

Perbedaannya terutama tentang kapan mengembalikan input tidak berubah, sebagai lawan membuat array baru sebagai salinan.

arraymenawarkan berbagai pilihan (sebagian besar fungsi lainnya adalah pembungkus tipis di sekitarnya), termasuk bendera untuk menentukan kapan harus menyalin. Penjelasan lengkap akan memakan waktu selama dokumen (lihat Array Creation , tetapi secara singkat, berikut adalah beberapa contoh:

Asumsikan aadalah ndarray, dan mmerupakan matrix, dan mereka berdua memiliki dtypedari float32:

  • np.array(a)dan np.array(m)akan menyalin keduanya, karena itulah perilaku default.
  • np.array(a, copy=False)dan np.array(m, copy=False)akan menyalin mtetapi tidak a, karena mbukan ndarray.
  • np.array(a, copy=False, subok=True)dan tidak np.array(m, copy=False, subok=True)akan menyalin, karena ma matrix, yang merupakan subclass dari ndarray.
  • np.array(a, dtype=int, copy=False, subok=True)akan menyalin keduanya, karena dtypetidak kompatibel.

Sebagian besar fungsi lainnya adalah pembungkus tipis di sekitar arraykontrol itu ketika penyalinan terjadi:

  • asarray: Input akan dikembalikan tanpa disalin jika itu kompatibel ndarray( copy=False).
  • asanyarray: Input akan dikembalikan tanpa disalin jika kompatibel ndarrayatau subkelas seperti matrix( copy=False, subok=True).
  • ascontiguousarray: Input akan dikembalikan tanpa disalin jika kompatibel ndarraydengan urutan C yang berdekatan ( copy=False, order='C').
  • asfortranarray: Input akan dikembalikan tanpa disalin jika itu kompatibel ndarraydengan urutan Fortran ( copy=False, order='F').
  • require: Input akan dikembalikan jika tidak dibuka, jika kompatibel dengan string persyaratan yang ditentukan.
  • copy: Masukan selalu disalin.
  • fromiter: Input diperlakukan sebagai iterable (jadi, misalnya, Anda dapat membuat array dari elemen iterator, alih-alih objectarray dengan iterator); selalu disalin.

Ada juga fungsi kenyamanan, seperti asarray_chkfinite(aturan penyalinan yang sama seperti asarray, tetapi memunculkan ValueErrorjika ada nanatau infnilai), dan konstruktor untuk subkelas seperti matrixatau untuk kasus khusus seperti array rekaman, dan tentu saja ndarraykonstruktor yang sebenarnya (yang memungkinkan Anda membuat array secara langsung keluar dari langkah di atas buffer).

abarnert
sumber
Terima kasih untuk itu, ini sangat membantu
Kris
234

The definisiasarray yaitu:

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

Jadi itu seperti array, kecuali ia memiliki lebih sedikit opsi, dan copy=False. arraymemiliki copy=Truesecara default.

Perbedaan utama adalah bahwa array(secara default) akan membuat salinan objek, sementara asarraytidak akan kecuali diperlukan.

unutbu
sumber
13
Jadi kapan kita harus menggunakan masing-masing? Jika membuat array dari awal, mana yang lebih baik, array([1, 2, 3])atau asarray([1, 2, 3])?
endolith
15
@endolith: [1, 2, 3]adalah daftar Python, jadi salinan data harus dibuat untuk membuatnya ndarary. Jadi gunakan np.arraylangsung daripada np.asarrayyang akan mengirim copy=Falseparameter ke np.array. Ini copy=Falsediabaikan jika salinan harus dibuat seperti dalam kasus ini. Jika Anda membandingkan keduanya menggunakan %timeitIPython, Anda akan melihat perbedaan untuk daftar kecil, tetapi tidak masalah yang Anda gunakan untuk daftar besar.
unutbu
3
Itu masuk akal per nama metode juga: "asarray": Perlakukan ini sebagai array (inplace), yaitu, Anda hanya mengubah pandangan Anda pada daftar / array ini. "array": Sebenarnya mengonversi ini ke array baru.
denvar
1
bagaimana np.asanyarray?
Lee
3
@ Lee: asarrayselalu mengembalikan sebuah ndarray. asanyarrayakan mengembalikan subkelas ndarrayjika itu yang diteruskan ke sana. Sebagai contoh, an np.matrixadalah subclass dari ndarray. Jadi np.asanyarray(np.matrix(...))mengembalikan matriks yang sama, sedangkan np.asarray(np.matrix(...))mengkonversi matriks menjadi ndarray.
unutbu
114

Perbedaannya dapat ditunjukkan dengan contoh ini:

  1. menghasilkan matriks

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. gunakan numpy.arrayuntuk memodifikasi A. Tidak berfungsi karena Anda memodifikasi salinan

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  3. gunakan numpy.asarrayuntuk memodifikasi A. Ini berhasil karena Anda memodifikasi Asendiri

    >>> numpy.asarray(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 2.,  2.,  2.]])

Semoga ini membantu!

Bobbie Wu
sumber
13

Perbedaan disebutkan cukup jelas dalam dokumentasi arraydan asarray. Perbedaannya terletak pada daftar argumen dan karenanya tindakan fungsi tergantung pada parameter tersebut.

Definisi fungsi adalah:

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

dan

numpy.asarray(a, dtype=None, order=None)

Argumen berikut adalah argumen yang dapat diteruskan ke arraydan tidak asarray seperti yang disebutkan dalam dokumentasi:

salin: bool, opsional Jika benar (default), maka objek akan disalin . Kalau tidak, salinan hanya akan dibuat jika __array__mengembalikan salinan, jika obj adalah urutan bersarang, atau jika salinan diperlukan untuk memenuhi persyaratan lain (dtype, pesanan, dll).

subok: bool, opsional Jika Benar, maka sub-kelas akan diteruskan , jika tidak array yang dikembalikan akan dipaksa menjadi array kelas-dasar (default).

ndmin: int, opsional Menentukan jumlah minimum dimensi yang harus dimiliki oleh array . Yang akan ditangguhkan ke bentuk sesuai kebutuhan untuk memenuhi persyaratan ini.

asheeshr
sumber
1

Berikut adalah contoh sederhana yang dapat menunjukkan perbedaannya.

Perbedaan utama adalah bahwa array akan membuat salinan data asli dan menggunakan objek yang berbeda, kita dapat memodifikasi data dalam array asli.

import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)

Isi dalam array (a), tetap tidak tersentuh, dan tetap saja, kita dapat melakukan operasi apa pun pada data menggunakan objek lain tanpa mengubah konten dalam array asli.

vivek
sumber
0

asarray(x) seperti array(x, copy=False)

Gunakan asarray(x)ketika Anda ingin memastikan bahwa itu xakan menjadi array sebelum operasi lain dilakukan. Jikax sudah merupakan array maka tidak ada salinan yang akan dilakukan. Itu tidak akan menyebabkan kinerja yang berlebihan.

Berikut adalah contoh fungsi yang memastikan xdikonversi menjadi array terlebih dahulu.

def mysum(x):
    return np.asarray(x).sum()
off99555
sumber