Jawaban:
Karena pertanyaan lain sedang dialihkan ke pertanyaan yang menanyakan asanyarray
atau 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.
array
menawarkan 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 a
adalah ndarray
, dan m
merupakan matrix
, dan mereka berdua memiliki dtype
dari 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 m
tetapi tidak a
, karena m
bukan ndarray
.np.array(a, copy=False, subok=True)
dan tidak np.array(m, copy=False, subok=True)
akan menyalin, karena m
a matrix
, yang merupakan subclass dari ndarray
.np.array(a, dtype=int, copy=False, subok=True)
akan menyalin keduanya, karena dtype
tidak kompatibel.Sebagian besar fungsi lainnya adalah pembungkus tipis di sekitar array
kontrol itu ketika penyalinan terjadi:
asarray
: Input akan dikembalikan tanpa disalin jika itu kompatibel ndarray
( copy=False
).asanyarray
: Input akan dikembalikan tanpa disalin jika kompatibel ndarray
atau subkelas seperti matrix
( copy=False
, subok=True
).ascontiguousarray
: Input akan dikembalikan tanpa disalin jika kompatibel ndarray
dengan urutan C yang berdekatan ( copy=False
, order='C')
.asfortranarray
: Input akan dikembalikan tanpa disalin jika itu kompatibel ndarray
dengan 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 object
array dengan iterator); selalu disalin.Ada juga fungsi kenyamanan, seperti asarray_chkfinite
(aturan penyalinan yang sama seperti asarray
, tetapi memunculkan ValueError
jika ada nan
atau inf
nilai), dan konstruktor untuk subkelas seperti matrix
atau untuk kasus khusus seperti array rekaman, dan tentu saja ndarray
konstruktor yang sebenarnya (yang memungkinkan Anda membuat array secara langsung keluar dari langkah di atas buffer).
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
. array
memiliki copy=True
secara default.
Perbedaan utama adalah bahwa array
(secara default) akan membuat salinan objek, sementara asarray
tidak akan kecuali diperlukan.
array([1, 2, 3])
atau asarray([1, 2, 3])
?
[1, 2, 3]
adalah daftar Python, jadi salinan data harus dibuat untuk membuatnya ndarary
. Jadi gunakan np.array
langsung daripada np.asarray
yang akan mengirim copy=False
parameter ke np.array
. Ini copy=False
diabaikan jika salinan harus dibuat seperti dalam kasus ini. Jika Anda membandingkan keduanya menggunakan %timeit
IPython, Anda akan melihat perbedaan untuk daftar kecil, tetapi tidak masalah yang Anda gunakan untuk daftar besar.
np.asanyarray
?
asarray
selalu mengembalikan sebuah ndarray
. asanyarray
akan mengembalikan subkelas ndarray
jika itu yang diteruskan ke sana. Sebagai contoh, an np.matrix
adalah subclass dari ndarray
. Jadi np.asanyarray(np.matrix(...))
mengembalikan matriks yang sama, sedangkan np.asarray(np.matrix(...))
mengkonversi matriks menjadi ndarray
.
Perbedaannya dapat ditunjukkan dengan contoh ini:
menghasilkan matriks
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
gunakan numpy.array
untuk memodifikasi A
. Tidak berfungsi karena Anda memodifikasi salinan
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
gunakan numpy.asarray
untuk memodifikasi A
. Ini berhasil karena Anda memodifikasi A
sendiri
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
Semoga ini membantu!
Perbedaan disebutkan cukup jelas dalam dokumentasi array
dan 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 array
dan 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.
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.
asarray(x)
seperti array(x, copy=False)
Gunakan asarray(x)
ketika Anda ingin memastikan bahwa itu x
akan 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 x
dikonversi menjadi array terlebih dahulu.
def mysum(x):
return np.asarray(x).sum()