Jaka jest różnica między funkcjami Array() Numpy i asarray ()?

Jaka jest różnica między Numpy ' S array() oraz asarray() funkcje? Kiedy należy używać jednego, a nie drugiego? Wydają się generować identyczne wyjście dla wszystkich wejść, o których myślę.

Author: nbro, 2013-01-19

6 answers

Ponieważ inne pytania są przekierowywane do tego, które pytają o asanyarray lub inne procedury tworzenia tablic , prawdopodobnie warto mieć krótkie podsumowanie tego, co każdy z nich robi.

Różnice dotyczą głównie tego, kiedy zwracać dane wejściowe bez zmian, w przeciwieństwie do tworzenia nowej tablicy jako kopii.

array oferuje szeroką gamę opcji (większość innych funkcji to cienkie owijki wokół niego), w tym flagi określające, kiedy kopiować. A pełne wyjaśnienie zajęłoby tyle samo czasu, co dokumenty (zobacz tworzenie tablicy , ale krótko, oto kilka przykładów:

Załóżmy, że a jest ndarray, A m jest matrix, i obie mają dtype z float32:

  • np.array(a) i np.array(m) skopiują oba, ponieważ jest to domyślne zachowanie.
  • np.array(a, copy=False) i np.array(m, copy=False) będą kopiować m, ale nie a, Ponieważ m nie jest ndarray.
  • np.array(a, copy=False, subok=True) i np.array(m, copy=False, subok=True) nie skopiują żadnego, ponieważ m jest matrix, który jest podklasa ndarray.
  • np.array(a, dtype=int, copy=False, subok=True) skopiuje oba, ponieważ {[6] } nie jest kompatybilny.

Większość innych funkcji to cienkie owijki wokół array, które kontrolują podczas kopiowania:

  • asarray: wejście zostanie zwrócone bez skopiowania iff jest kompatybilny ndarray (copy=False).
  • asanyarray: wejście zostanie zwrócone bez skopiowania iff jest to kompatybilna ndarray lub podklasa jak matrix (copy=False, subok=True).
  • ascontiguousarray: na dane wejściowe zostaną zwrócone bez skopiowania iff jest to zgodne ndarray w ciągłej kolejności C (copy=False, order='C').
  • asfortranarray: dane wejściowe zostaną zwrócone bez skopiowania iff jest to zgodne ndarray w ciągłej kolejności Fortran (copy=False, order='F').
  • require: wejście zostanie zwrócone bez skopiowania iff jest zgodne z podanym łańcuchem wymagań.
  • copy: dane wejściowe są zawsze kopiowane.
  • fromiter: wejście jest traktowane jako iterable( tak, na przykład, można zbudować tablicę z elementów iteratora, zamiast tablicy object Z iteratorem); zawsze kopiowane.

Istnieją również funkcje wygody, takie jak asarray_chkfinite (takie same zasady kopiowania jak asarray, ale podnosi ValueError jeśli istnieją jakieś nan lub inf wartości), i konstruktory dla podklas jak matrix lub dla szczególnych przypadków jak tablice rekordów, i oczywiście rzeczywiste ndarray konstruktor (który pozwala na utworzenie tablicy bezpośrednio na zewnątrz kroków nad buforem).

 146
Author: abarnert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 19:06:29

Definicja asarray jest:

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

Więc jest jak array, z tym, że ma mniej opcji, i copy=False. array domyślnie posiada copy=True.

Główna różnica polega na tym, że array (domyślnie) zrobi kopię obiektu, podczas gdy asarray nie zrobi, chyba że będzie to konieczne.

 249
Author: unutbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-13 12:13:24

Różnicę można wykazać za pomocą tego przykładu:

  1. Wygeneruj macierz

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
    
  2. Użyj numpy.array, aby zmodyfikować A. Nie działa, ponieważ modyfikujesz kopię

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
    
  3. Użyj numpy.asarray, aby zmodyfikować A. Działa, ponieważ modyfikujesz A siebie

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

Mam nadzieję, że to pomoże!

 127
Author: Bobbie Wu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-04 09:31:39

Różnice są dość wyraźnie wymienione w dokumentacji array oraz asarray. Różnice leżą w liście argumentów i stąd działanie funkcji w zależności od tych parametrów.

Definicje funkcji to:

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

I

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

Poniższe argumenty mogą być przekazane array i nie asarray Jak wspomniano w dokumentacji:

Copy: bool, optional If true (domyślnie), wtedy obiekt zostanie skopiowany . W przeciwnym razie kopia zostanie wykonana tylko wtedy, gdy __array__ zwróci kopię, jeśli obj jest sekwencją zagnieżdżoną, lub jeśli kopia jest potrzebna, aby spełnić którekolwiek z inne wymagania (dtype, order, etc.).

Subok : bool, opcjonalne Jeśli True, to podklasy będą przepuszczone , w przeciwnym razie zwracana tablica będzie zmuszona do tablica klasy base (domyślnie).

Ndmin: int, opcjonalnie określa minimalną liczbę wymiarów że tablica wynikowa powinna mieć. Te będą wstępnie przypięte do kształtu w razie potrzeby, aby spełnić ten wymóg.

 13
Author: asheeshr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-19 15:53:55

Oto prosty przykład, który może wykazać różnicę.

Główną różnicą jest to, że tablica zrobi kopię oryginalnych danych i używając innego obiektu możemy zmodyfikować dane w oryginalnej tablicy.

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

Zawartość w tablicy (a) pozostaje nietknięta, a mimo to możemy wykonać dowolną operację na danych przy użyciu innego obiektu bez modyfikowania zawartości w oryginalnej tablicy.

 1
Author: vivek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-11 21:01:34

asarray(x) jest jak array(x, copy=False)

Użyj asarray(x), gdy chcesz mieć pewność, że x będzie tablicą przed wykonaniem innych operacji. Jeśli x jest już tablicą, to nie zostanie wykonana żadna Kopia. Nie spowodowałoby to zbytniego spadku wydajności.

Oto przykład funkcji, która zapewnia, że x zostanie przekonwertowana jako pierwsza do tablicy.

def mysum(x):
    return np.asarray(x).sum()
 1
Author: off99555,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-30 12:33:40