Yanıtlar:
Diğer sorular bu soruyu asanyarray
veya diğer dizi oluşturma rutinlerini soran sorulara yönlendirildiğinden , muhtemelen her birinin ne yaptığının kısa bir özetini değer.
Farklılıklar, yeni bir dizi kopya olarak yapmak yerine, girişin ne zaman değiştirilmeyeceği ile ilgilidir.
array
ne zaman kopyalanacağını belirlemek için bayraklar da dahil olmak üzere çok çeşitli seçenekler sunar (diğer işlevlerin çoğu etrafındaki ince sargılardır). Tam bir açıklama dokümanlar kadar uzun sürecektir (bakınız Dizi Oluşturma , ancak kısaca, işte bazı örnekler:
Varsayalım a
bir olduğunu ndarray
ve m
bir olduğunu matrix
ve her ikisi de bir var dtype
bir float32
:
np.array(a)
ve np.array(m)
her ikisini de kopyalayacaktır, çünkü bu varsayılan davranıştır.np.array(a, copy=False)
ve np.array(m, copy=False)
kopyalayacak, m
ama yapmayacak a
, çünkü m
bir ndarray
.np.array(a, copy=False, subok=True)
ve np.array(m, copy=False, subok=True)
çünkü kopyalamak ne olacak m
bir olduğu matrix
bir alt sınıf olan ndarray
.np.array(a, dtype=int, copy=False, subok=True)
dtype
uyumlu olmadığından her ikisini de kopyalar .Diğer işlevlerin çoğu array
, kopyalama sırasında bu kontrolün etrafındaki ince sarmalayıcılardır :
asarray
: Uyumlu ndarray
( copy=False
) ise giriş kopyalanmamış olarak döndürülür .asanyarray
: Uyumlu, ndarray
veya matrix
( copy=False
, subok=True
) gibi bir alt sınıf olması durumunda girdi kopyalanmayacaktır .ascontiguousarray
: ndarray
Bitişik C düzeninde uyumlu ise giriş kopyalanmamış olarak iade edilir ( copy=False
, order='C')
.asfortranarray
: ndarray
Bitişik Fortran düzeninde ( copy=False
, order='F'
) uyumluysa giriş kopyalanmamış olarak geri gönderilir .require
: Belirtilen gereksinimler dizesiyle uyumluysa giriş kopyalanmamış olarak geri gönderilir.copy
: Giriş her zaman kopyalanır.fromiter
: Giriş yinelemeli olarak ele alınır (böylece, yineleyiciye sahip bir object
dizi yerine yineleyicinin öğelerinden bir dizi oluşturabilirsiniz); her zaman kopyalanır.Ayrıca asarray_chkfinite
(aynı kopyalama kuralları asarray
, ancak ValueError
herhangi bir nan
veya inf
değer varsa yükseltir) gibi kolaylık işlevleri ve matrix
kayıt dizileri gibi veya özel durumlar için alt sınıflar ve elbette asıl ndarray
kurucu (doğrudan bir dizi oluşturmanıza izin veren) bir arabellek üzerinden adımların dışında).
Nedirasarray
geçerli:
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
Yani array
daha az seçeneğe sahip olması haricinde, ve copy=False
. array
vardır copy=True
varsayılan olarak.
Temel fark array
(varsayılan olarak) nesnenin bir kopyasını oluşturacak, ancak asarray
gerekli olmadığı sürece yapamayacağıdır.
array([1, 2, 3])
ya da asarray([1, 2, 3])
?
[1, 2, 3]
bir Python listesidir, bu nedenle verilerin oluşturulması için verilerin bir kopyası alınmalıdır ndarary
. Bu yüzden parametrenin gönderileceği np.array
yerine doğrudan kullanın . Bu durumda olacağı gibi bir kopyası yapılmalıdır eğer göz ardı edilir. IPython'da ikisini karşılaştırırsanız, küçük listeler için bir fark görürsünüz, ancak büyük listeler için kullandığınız pek önemli değildir. np.asarray
copy=False
np.array
copy=False
%timeit
np.asanyarray
?
asarray
her zaman bir döndürür ndarray
. asanyarray
kendisine ndarray
aktarılmışsa alt sınıfını döndürür . Örneğin, an np.matrix
bir alt sınıfıdır ndarray
. Böylece np.asanyarray(np.matrix(...))
, aynı matrisi döndürürken, np.asarray(np.matrix(...))
matrisi bir ndarray
.
Fark bu örnekle gösterilebilir:
bir matris oluştur
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
numpy.array
değiştirmek için kullanın A
. Bir kopyasını değiştirdiğiniz için çalışmıyor
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
numpy.asarray
değiştirmek için kullanın A
. İşe yaradı çünkü A
kendini değiştiriyorsunuz
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
Bu yardımcı olur umarım!
Farklılıklar dokümanlarında oldukça açık bahsedilmektedir array
ve asarray
. Farklılıklar argüman listesinde yer alır ve bu nedenle bu parametrelere bağlı olarak işlevin eylemi ortaya çıkar.
İşlev tanımları:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
ve
numpy.asarray(a, dtype=None, order=None)
Aşağıdaki tartışmalar geçirilebilmektedir olanlardır array
ve olmayan asarray
şekilde belgelerinde belirtildiği:
copy: bool, isteğe bağlı true (varsayılan) ise, nesne kopyalanır . Aksi takdirde, bir kopya yalnızca
__array__
bir kopya döndürürse, nesne iç içe bir diziyse veya diğer gereksinimlerden herhangi birini (dtype, düzen vb.) Karşılamak için bir kopyaya ihtiyaç duyulursa yapılır.subok: bool, isteğe bağlı True ise, alt sınıflar geçirilir , aksi takdirde döndürülen dizi bir temel sınıf dizisi (varsayılan) olmaya zorlanır.
ndmin: int, isteğe bağlı Sonuçlanan dizinin sahip olması gereken minimum boyut sayısını belirtir . Bu gereksinimi karşılamak için olanlar gerektiği gibi şekle önceden eklenecektir.
İşte farkı gösterebilecek basit bir örnek.
Ana fark, dizinin orijinal verilerin bir kopyasını oluşturacağı ve farklı bir nesne kullanarak orijinal dizideki verileri değiştirebileceğimizdir.
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
(A) dizisindeki içeriklere dokunulmaz ve yine de orijinal dizideki içeriği değiştirmeden başka bir nesne kullanarak veriler üzerinde herhangi bir işlem gerçekleştirebiliriz.
asarray(x)
gibi array(x, copy=False)
Diğer işlemler yapılmadan önce bir dizi asarray(x)
olmasını sağlamak istediğinizde kullanın x
. Eğerx
Zaten bir dizi , hiçbir kopya yapılmaz. Gereksiz performans isabetine neden olmaz.
x
İlk önce bir diziye dönüştürülmesini sağlayan bir işlev örneği .
def mysum(x):
return np.asarray(x).sum()