¿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 ?

Ben
fuente

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.]])
Stephen Simmons
fuente
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!

Greg Ball
fuente
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.]]
Franck Dernoncourt
fuente
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.

Andrei Paga
fuente
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.

Il-Bhima
fuente
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.
cyborg
fuente
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]
Ali G
fuente
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.])

Darius
fuente
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í .

sin bar
fuente
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)
runo
fuente
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.

veeresh d
fuente
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.

Pedram
fuente
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.

Edgar Duarte
fuente