¿Cómo creo una matriz / matriz vacía en NumPy?


311

No puedo entender cómo usar una matriz o matriz de la forma en que normalmente usaría una lista. Quiero crear una matriz vacía (o matriz) y luego agregarle una columna (o fila) a la vez.

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

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

Mientras que si fuera una lista, haría algo como esto:

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

¿Hay alguna manera de usar ese tipo de notación para matrices o matrices NumPy ?

Respuestas:


441

Tiene el 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 repetidamente para construir una matriz.

En el caso de agregar filas, su mejor opción es crear una matriz que sea tan grande como su conjunto de datos eventualmente 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.]])

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

21
¿Cuál es el beneficio de usar empty () sobre ceros ()?
Zach

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

16
@maracorossi .empty()significa que uno puede encontrar valores aleatorios en las celdas, pero la matriz se crea más rápido que, por ejemplo, con .zeros()?
user3085931

66
@ user3085931 sí!
Nathan

98

Una matriz NumPy es una estructura de datos muy diferente de una lista y está diseñada para usarse de diferentes maneras. Su uso de hstackes potencialmente muy ineficiente ... cada vez que lo llama, todos los datos en la matriz existente se copian en una nueva. (La appendfunción tendrá el mismo problema). Si desea construir su matriz columna por columna, es mejor 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)

itempuede ser una lista, una matriz o cualquier iterable, siempre que cada uno itemtenga el mismo número de elementos.
En este caso particular ( dataes iterativo mantener las columnas de la matriz) simplemente puede usar


mat = numpy.array(data)

(También tenga en cuenta que usar listcomo nombre de variable probablemente no sea una buena práctica ya que enmascara el tipo incorporado con ese nombre, lo que puede provocar errores)

EDITAR:

Si por alguna razón realmente desea crear una matriz vacía, puede usarla numpy.array([]), ¡pero esto rara vez es útil!


1
¿Las matrices / matrices numpy son fundamentalmente diferentes de las de Matlab?
Levesque

1
Si por alguna razón es necesario definir una matriz vacía, pero con ancho fijo (por ejemplo np.concatenate()), puede utilizar: np.empty((0, some_width)). 0, por lo que su primera matriz no será basura.
NumesSanguis

56

Para crear una matriz multidimensional vacía en NumPy (por ejemplo, una matriz 2D m*npara almacenar su matriz), en caso de que no sepa mcuántas filas agregará y no le importa el costo computacional que mencionó Stephen Simmons (es decir, reconstruir el matriz en cada append), se puede exprimir a 0 la dimensión a la que desea anexar a: X = np.empty(shape=[0, n]).

De esta manera puede usar, por ejemplo (aquí, m = 5que asumimos que no sabíamos al 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 te dará:

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

1
Esta debería ser la respuesta a la pregunta que hizo OP, para el caso de uso en el que no conoce #rows de antemano, o desea manejar el caso de que haya 0 filas
Spcogg el segundo

26

Investigué mucho esto porque necesitaba usar un numpy.array como conjunto en uno de mis proyectos escolares y necesitaba que se inicializara vacío ... No encontré ninguna respuesta relevante aquí en Stack Overflow, así que comencé garabateando 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, puede inicializar directamente una matriz np de la siguiente manera:

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

Espero que esto ayude.


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

a=np.array([])parece predeterminado afloat64
P i

7

Puedes usar la función append. Para 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 menciona en otras respuestas, a menos que esté haciendo algún procesamiento (por ejemplo, inversión) en la matriz / matriz CADA vez que le agregue algo, simplemente crearía una lista, la agregaría y luego la convertiría en un formación.


3

Si no conoce el tamaño final de la matriz, 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.]]
  • Observe el 0en la primera línea.
  • numpy.appendEs otra opción. Llama numpy.concatenate.

3

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

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

44
Si quieres hacer eso en Python puro, esta a= [0] * 5es la solución simple
Makers_F

3

Aquí hay una solución alternativa para hacer que los numpys se parezcan más a las listas

np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)

SALIDA: matriz ([2., 24.])


2

Dependiendo de para qué esté usando esto, es posible que deba especificar el tipo de datos (consulte 'dtype' ).

Por ejemplo, para crear una matriz 2D de valores de 8 bits (adecuada para usar como imagen monocroma):

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

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

También puede considerar la inicialización cero con en numpy.zeroslugar de usar numpy.empty. Ver la nota aquí .


1

Creo que desea manejar la mayor parte del trabajo con listas y luego usar el resultado como una matriz. Tal vez esta es una manera;

ur_list = []
for col in columns:
    ur_list.append(list(col))

mat = np.matrix(ur_list)

1

Creo que puedes crear una matriz vacía vacía como:

>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)

Este formato es útil cuando desea agregar una matriz numpy en el bucle.


0

Para crear una matriz NumPy vacía sin definir su forma, hay una manera:

1)

arr = np.array([]) 

privilegiado. porque sabes que usarás esto como numpy.

2)

arr = []
# and use it as numpy. append to it or etc..

NumPy convierte esto al tipo np.ndarray después, sin extra [] dimionsion.


0

Quizás lo que estás buscando es algo como esto:

x=np.array(0)

De esta manera, puede crear una matriz sin ningún elemento. Es similar a:

x=[]

De esta manera, podrá agregar nuevos elementos a su matriz de antemano.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.