Numpy'nin array () ve asarray () işlevleri arasındaki fark nedir?


298

Numpy'ler array()ve asarray()fonksiyonlar arasındaki fark nedir ? Birini diğerinden ne zaman kullanmalısınız? Aklıma gelen tüm girdiler için aynı çıktıyı üretiyor gibi görünüyorlar.

Yanıtlar:


110

Diğer sorular bu soruyu asanyarrayveya 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.

arrayne 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 abir olduğunu ndarrayve mbir olduğunu matrixve her ikisi de bir var dtypebir 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, mama yapmayacak a, çünkü mbir ndarray.
  • np.array(a, copy=False, subok=True)ve np.array(m, copy=False, subok=True)çünkü kopyalamak ne olacak mbir olduğu matrixbir alt sınıf olan ndarray.
  • np.array(a, dtype=int, copy=False, subok=True)dtypeuyumlu 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, ndarrayveya matrix( copy=False, subok=True) gibi bir alt sınıf olması durumunda girdi kopyalanmayacaktır .
  • ascontiguousarray: ndarrayBitişik C düzeninde uyumlu ise giriş kopyalanmamış olarak iade edilir ( copy=False, order='C').
  • asfortranarray: ndarrayBitiş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 objectdizi yerine yineleyicinin öğelerinden bir dizi oluşturabilirsiniz); her zaman kopyalanır.

Ayrıca asarray_chkfinite(aynı kopyalama kuralları asarray, ancak ValueErrorherhangi bir nanveya infdeğer varsa yükseltir) gibi kolaylık işlevleri ve matrixkayıt dizileri gibi veya özel durumlar için alt sınıflar ve elbette asıl ndarraykurucu (doğrudan bir dizi oluşturmanıza izin veren) bir arabellek üzerinden adımların dışında).


Bunun için teşekkürler, çok faydalı
Kris

234

Nedirasarray geçerli:

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

Yani arraydaha az seçeneğe sahip olması haricinde, ve copy=False. arrayvardır copy=Truevarsayılan olarak.

Temel fark array(varsayılan olarak) nesnenin bir kopyasını oluşturacak, ancak asarraygerekli olmadığı sürece yapamayacağıdır.


13
Peki her birini ne zaman kullanmalıyız? Sıfırdan bir dizi, daha da, oluşturma işlemi array([1, 2, 3])ya da asarray([1, 2, 3])?
endolith

15
@ endolith: [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.arrayyerine 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.asarraycopy=Falsenp.arraycopy=False%timeit
unutbu

3
Bu yöntem adlarına göre de mantıklıdır: "asarray": Bunu bir dizi (yerinde) olarak ele alalım, yani, bu liste / dizi üzerindeki görünümünüzü değiştiriyorsunuz. "array": Aslında bunu yeni bir diziye dönüştürür.
denvar

1
nasıl np.asanyarray?
Lee

3
@Lee: asarrayher zaman bir döndürür ndarray. asanyarraykendisine ndarrayaktarılmışsa alt sınıfını döndürür . Örneğin, an np.matrixbir 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.
unutbu

114

Fark bu örnekle gösterilebilir:

  1. bir matris oluştur

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. numpy.arraydeğ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.]])
  3. numpy.asarraydeğiştirmek için kullanın A. İşe yaradı çünkü Akendini 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!


13

Farklılıklar dokümanlarında oldukça açık bahsedilmektedir arrayve 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 arrayve 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.


1

İş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.


0

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ğerxZaten 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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.