Existe uma maneira de inicializar uma matriz numpy de uma forma e adicionar a ela? Vou explicar o que preciso com um exemplo de lista. Se eu quiser criar uma lista de objetos gerados em um loop, eu posso fazer:
a = []
for i in range(5):
a.append(i)
Eu quero fazer algo semelhante com uma matriz numpy. Eu sei sobre vstack, concatenar etc. No entanto, parece que estes requerem duas matrizes numpy como entradas. O que eu preciso é:
big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
array i of shape = (2,4) created.
add to big_array
O big_array
deve ter uma forma (10,4)
. Como fazer isso?
EDITAR:
Quero adicionar o seguinte esclarecimento. Estou ciente de que posso definir big_array = numpy.zeros((10,4))
e preenchê-lo. No entanto, isso requer a especificação antecipada do tamanho do big_array. Eu sei o tamanho neste caso, mas e se eu não? Quando usamos a .append
função para estender a lista em python, não precisamos conhecer seu tamanho final com antecedência. Gostaria de saber se existe algo semelhante para criar uma matriz maior a partir de matrizes menores, começando com uma matriz vazia.
[i for i in range(5)]
. (Equivalentemente:,list(range(5))
embora este seja um exemplo artificial.) #x = numpy.array()
exatamente como faríamos com uma lista comoy = []
; mas não funcionouRespostas:
ou
ou
No entanto, a mentalidade em que construímos uma matriz anexando elementos a uma lista não é muito usada em numpy, porque é menos eficiente (os tipos de dados numpy estão muito mais próximos das matrizes C subjacentes). Em vez disso, você deve pré-alocar a matriz para o tamanho que precisa e, em seguida, preencha as linhas. Você pode usar
numpy.append
se precisar, no entanto.fonte
append
numpy. Só que é menos eficiente não pré-alocar (nesse caso, muito menos eficiente, já queappend
copia toda a matriz toda vez), portanto, não é uma técnica padrão.np.empty
matriz for preenchida por valores? E os itens "vazios" restantes?np.concatenate()
), você pode inicializar com:np.empty((0, some_width))
. 0, então sua primeira matriz não será lixo.A maneira como costumo fazer isso é criando uma lista regular, anexando minhas coisas a ela e, finalmente, transformando a lista em uma matriz numpy da seguinte maneira:
é claro que seu objeto final ocupa o dobro do espaço na memória na etapa de criação, mas anexar na lista python é muito rápido, e a criação usando np.array () também.
fonte
Introduzido no numpy 1.8:
Exemplos:
fonte
Análogo de matriz para o python
é:
fonte
empty((0))
inicializa uma matriz numpy.numpy.fromiter()
é o que você está procurando:Também funciona com expressões geradoras, por exemplo:
Se você souber o tamanho da matriz com antecedência, poderá especificá-la com um argumento opcional 'count'.
fonte
Você deseja evitar loops explícitos o máximo possível ao fazer a computação em matriz, pois isso reduz o ganho de velocidade dessa forma de computação. Existem várias maneiras de inicializar uma matriz numpy. Se você quiser preenchê-lo com zeros, faça o que o katrielalex disse:
big_array = numpy.zeros((10,4))
EDIT: Que tipo de sequência você está fazendo? Você deve verificar as diferentes funções numpy que criam matrizes, como
numpy.linspace(start, stop, size)
(número igualmente espaçado) ounumpy.arange(start, stop, inc)
. Onde possível, essas funções tornarão as matrizes substancialmente mais rápidas do que o mesmo trabalho em loops explícitosfonte
Para o seu primeiro exemplo de matriz, use,
Para inicializar big_array, use
Isso pressupõe que você deseja inicializar com zeros, o que é bastante típico, mas existem muitas outras maneiras de inicializar uma matriz em numpy .
Edit: Se você não sabe o tamanho de big_array antecipadamente, geralmente é melhor primeiro criar uma lista Python usando o append e, quando você tiver tudo reunido na lista, converta essa lista em uma matriz numpy usando
numpy.array(mylist)
. A razão para isso é que as listas devem crescer muito eficientemente e rapidamente, enquanto que o numpy.concatenate seria muito ineficiente, pois matrizes numpy não mudam de tamanho facilmente. Porém, quando tudo é coletado em uma lista e você sabe o tamanho final da matriz, uma matriz numpy pode ser construída com eficiência.fonte
Para inicializar uma matriz numpy com uma matriz específica:
resultado:
fonte
Sempre que você estiver na seguinte situação:
e você deseja algo semelhante em numpy, várias respostas anteriores apontaram maneiras de fazer isso, mas como @katrielalex apontou, esses métodos não são eficientes. A maneira eficiente de fazer isso é criar uma lista longa e remodelá-la da maneira que desejar depois de ter uma lista longa. Por exemplo, digamos que estou lendo algumas linhas de um arquivo e cada linha tem uma lista de números e quero criar uma matriz numpy de forma (número de linhas lidas, comprimento do vetor em cada linha). Aqui está como eu faria isso com mais eficiência:
fonte
Percebo que isso é um pouco tarde, mas não notei nenhuma das outras respostas mencionando a indexação na matriz vazia:
Dessa forma, você pré-aloca toda a matriz de resultados
numpy.empty
e preenche as linhas à medida que utiliza a atribuição indexada.É perfeitamente seguro pré-alocar em
empty
vez dozeros
exemplo que você deu, pois você garante que toda a matriz será preenchida com os pedaços que você gerar.fonte
Eu sugiro definir a forma primeiro. Em seguida, itere sobre ele para inserir valores.
fonte
Talvez algo assim atenda às suas necessidades.
Que produz a seguinte saída
fonte