2009-02-20 42 views
177

No puedo entender cómo usar una matriz o matriz de la manera en que normalmente usaría una lista. Quiero crear un conjunto vacío (o matriz) y luego agregarle una columna (o una fila) a la vez.¿Cómo creo una matriz/matriz vacía en NumPy?

Por el momento la única manera en que puedo encontrar para hacer esto es como:

mat = None 
for col in columns: 
    if mat is None: 
     mat = col 
    else: 
     mat = hstack((mat, col)) 

Mientras que si se tratara de una lista, me gustaría hacer algo como esto:

list = [] 
for item in data: 
    list.append(item) 

¿Hay una forma de utilizar ese tipo de notación para NumPy matrices o matrices?

Respuesta

261

Tiene un modelo mental incorrecto para usar NumPy de manera eficiente. Las matrices NumPy se almacenan en bloques contiguos de memoria. Si desea agregar filas o columnas a una matriz existente, la matriz completa debe copiarse en un nuevo bloque de memoria, creando espacios para que se almacenen los nuevos elementos. Esto es muy ineficiente si se hace de forma repetida para construir una matriz.

En el caso de añadir filas, lo mejor es crear una matriz que es tan grande como el conjunto de datos con el tiempo será, y luego agregar datos fila por fila:

>>> import numpy 
>>> a = numpy.zeros(shape=(5,2)) 
>>> a 
array([[ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.]]) 
>>> a[0] = [1,2] 
>>> a[1] = [2,3] 
>>> a 
array([[ 1., 2.], 
    [ 2., 3.], 
    [ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.]]) 
+75

También hay numpy.empty() si no necesita poner a cero la matriz. – janneb

+10

¿Cuál es la ventaja de usar empty() sobre ceros()? – Zach

+25

que si va a inicializarlo con sus datos de inmediato, ahorrará el costo de ponerlo a cero. – marcorossi

6

Puede usar la función de agregar. Para las filas:

>>> from numpy import * 
>>> a = array([10,20,30]) 
>>> append(a, [[1,2,3]], axis=0) 
array([[10, 20, 30],  
     [1, 2, 3]]) 

para columnas:

>>> append(a, [[15],[15]], axis=1) 
array([[10, 20, 30, 15],  
     [1, 2, 3, 15]]) 

EDITAR
Por supuesto, como se ha mencionado en otras respuestas, a menos que usted está haciendo algún tipo de procesamiento (por ejemplo, la inversión.) En la matriz/matriz CADA vez que agregue algo, simplemente crearía una lista, la anexaría y luego la convertiría en una matriz.

62

Una matriz NumPy es una estructura de datos muy diferente de una lista y está diseñada para ser utilizada de diferentes maneras. Su uso de hstack es potencialmente muy ineficiente ... cada vez que lo llama, todos los datos del conjunto existente se copian en uno nuevo. (La función append tendrá el mismo problema). Si desea construir su matriz una columna a la vez, lo mejor será que la mantenga en una lista hasta que termine y solo luego conviértala en una matriz.

p. Ej.


mylist = [] 
for item in data: 
    mylist.append(item) 
mat = numpy.array(mylist) 

item puede ser una lista, una matriz o cualquier iterable, siempre como cada item tiene el mismo número de elementos.
En este caso particular (data es un poco de iterable la celebración de las columnas de la matriz) puede simplemente usar


mat = numpy.array(data) 

(Tenga en cuenta también que el uso de list como nombre de variable probablemente no es una buena práctica ya que enmascara el tipo incorporado con ese nombre, lo que puede conducir a errores.)

EDIT:

Si por alguna razón usted realmente desea crear una matriz vacía, sólo se puede utilizar numpy.array([]), pero esto no suele ser útil!

+1

¿Las matrices/matrices numpy son fundamentalmente diferentes de las de Matlab? – levesque

+2

@levesque Look [HERE] (http://www.scipy.org/NumPy_for_Matlab_Users) – pmav99

+0

Si por algún motivo necesita definir una matriz vacía, pero con un ancho fijo (por ejemplo, 'np.concatenate()'), puede uso: 'np.empty ((0, some_width))'. 0, por lo que su primer conjunto no será basura. – NumesSanguis

3

Si a pesar de todo no se conoce el tamaño final de la matriz, se puede incrementar el tamaño de la matriz de esta manera:

my_arr = numpy.zeros((0,5)) 
for i in range(3): 
    my_arr=numpy.concatenate((my_arr, numpy.ones((1,5)))) 
print(my_arr) 

[[ 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1.]] 
  • Aviso del 0 en la primera línea.
  • numpy.append es otra opción. Llama al numpy.concatenate.
18

Investigué esto mucho porque necesitaba usar un numpy.array como un conjunto en uno de mis proyectos escolares y necesitaba inicializarlo vacío ... No encontré ninguna respuesta relevante aquí en Stack Overflow, así que comencé a garabatear algo.

# Initialize your variable as an empty list first 
In [32]: x=[] 
# and now cast it as a numpy ndarray 
In [33]: x=np.array(x) 

El resultado será:

In [34]: x 
Out[34]: array([], dtype=float64) 

Por lo tanto se puede inicializar directamente una serie NP de la siguiente manera:

In [36]: x= np.array([], dtype=np.float64) 

espero que esto ayude.

+0

Esto no funciona para las matrices, como en la pregunta, pero puede ser útil para los vectores. – divenex

28

para crear una matriz multidimensional en el vacío NumPy (por ejemplo, una matriz 2D m*n para almacenar la matriz), en caso de que no se sabe cuántas filas m va a añadir y no se preocupan por el coste computacional Stephen Simmons mencionó (es decir, reconstruir la matriz en cada anexo), puede apretar a 0 la dimensión a la que desea agregar: X = np.empty(shape=[0, n]).

esta manera se puede utilizar, por ejemplo (en este caso m = 5 que suponemos que no sabíamos la hora de crear la matriz vacía, y n = 2):

import numpy as np 

n = 2 
X = np.empty(shape=[0, n]) 

for i in range(5): 
    for j in range(2): 
     X = np.append(X, [[i, j]], axis=0) 

print X 

que le dará:

[[ 0. 0.] 
[ 0. 1.] 
[ 1. 0.] 
[ 1. 1.] 
[ 2. 0.] 
[ 2. 1.] 
[ 3. 0.] 
[ 3. 1.] 
[ 4. 0.] 
[ 4. 1.]] 
2

Puede aplicarlo para crear cualquier tipo de matriz, como ceros:

a = range(5) 
a = [i*0 for i in a] 
print a 
[0, 0, 0, 0, 0] 
+2

Si quieres hacer eso en python puro, 'a = [0] * 5' es la solución simple –

0

De pendiente de lo que está utilizando para esto, es posible que deba especificar el tipo de datos (consulte 'dtype').

Por ejemplo, para crear una matriz 2D de valores de 8 bits (adecuado para uso en una imagen monocroma como):

myarray = numpy.empty(shape=(H,W),dtype='u1') 

Para una imagen RGB, incluyen el número de canales de color en la forma: shape=(H,W,3)

Es posible que también desee considerar la inicialización cero con numpy.zeros en lugar de utilizar numpy.empty. Ver la nota here.