Qual é a diferença entre ndarray e array em numpy?


Respostas:


220

numpy.arrayé apenas uma função de conveniência para criar um ndarray; não é uma classe em si.

Você também pode criar uma matriz usando numpy.ndarray, mas não é a maneira recomendada. A partir da doutrina de numpy.ndarray:

As matrizes devem ser construídas usando array, zerosou empty... Os parâmetros fornecidos aqui se referem a um método de baixo nível ( ndarray(...)) para instanciar uma matriz.

A maior parte da carne da implementação está no código C, aqui em multiarray , mas você pode começar a olhar para as interfaces ndarray aqui:

https://github.com/numpy/numpy/blob/master/numpy/core/numeric.py


1
Eu acho que array () é implementado no core / src / multiarray / methods.c em array_getarray ().
flxb

6
Isso pode te morder se você esquecer que np.arraynão é uma aula, como eu costumo fazer. x = np.array([1,2.1,3]) if isinstance(x,np.array): # will give you a TypeError
Steve L

4
Ainda não tenho idéia por que evitar o uso do ndarray? Porque é de baixo nível?
GabrielChu

@flxb: Não, array_getarrayé a implementação de numpy.ndarray.__array__. numpy.arraycomeça em _array_fromobject, pelo menos na implementação atual.
User2357112 suporta Monica

2
Então, por que não é recomendado?
NoName


31

Apenas algumas linhas de código de exemplo para mostrar a diferença entre numpy.array e numpy.ndarray

Etapa de aquecimento: criar uma lista

a = [1,2,3]

Verifique o tipo

print(type(a))

Você vai ter

<class 'list'>

Construa uma matriz (de uma lista) usando np.array

a = np.array(a)

Ou você pode pular a etapa de aquecimento, diretamente

a = np.array([1,2,3])

Verifique o tipo

print(type(a))

Você vai ter

<class 'numpy.ndarray'>

que indica o tipo da matriz numpy é numpy.ndarray

Você também pode verificar o tipo

isinstance(a, (np.ndarray))

e você receberá

True

Uma das duas linhas a seguir exibirá uma mensagem de erro

np.ndarray(a)                # should be np.array(a)
isinstance(a, (np.array))    # should be isinstance(a, (np.ndarray))

4

numpy.ndarray()é uma classe, enquanto numpy.array()é um método / função para criar ndarray.

Em documentos numpy, se você deseja criar uma matriz a partir da ndarrayclasse, pode fazê-lo de duas maneiras, conforme citado:

1- usando array(), zeros()ou empty()métodos: As matrizes devem ser construídas usando matriz, zeros ou vazio (consulte a seção Consulte também abaixo). Os parâmetros fornecidos aqui se referem a um método de baixo nível ( ndarray(…)) para instanciar uma matriz.

2- ndarraydiretamente da classe: existem dois modos de criar uma matriz usando__new__ : Se o buffer for Nenhum, somente forma, tipo e ordem serão usados. Se buffer é um objeto que expõe a interface do buffer, todas as palavras-chave são interpretadas.

O exemplo abaixo fornece uma matriz aleatória porque não atribuímos valor de buffer:

np.ndarray(shape=(2,2), dtype=float, order='F', buffer=None)

array([[ -1.13698227e+002,   4.25087011e-303],
       [  2.88528414e-306,   3.27025015e-309]])         #random

outro exemplo é atribuir um objeto de matriz ao exemplo de buffer:

>>> np.ndarray((2,), buffer=np.array([1,2,3]),
...            offset=np.int_().itemsize,
...            dtype=int) # offset = 1*itemsize, i.e. skip first element
array([2, 3])

do exemplo acima, notamos que não podemos atribuir uma lista ao "buffer" e tivemos que usar numpy.array () para retornar o objeto ndarray para o buffer

Conclusão: uso numpy.array() se você quiser criar um numpy.ndarray()objeto "


0

Eu acho que com np.array()você só pode criar C como se você mencionasse a ordem, quando você verifica usando np.isfortran(), diz false. mas com np.ndarrray()quando você especificar o pedido que ele cria com base no pedido fornecido.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.