¿Cómo puedo formar matrices en Python?

publicado por: Anonymous

En mi código pido mediante el ingreso de datos por teclado (raw_input) un numero_x de elementos, luego pudo los valores de p, q, r, x y b para cada elemento X. Lo que busco es formar una matroz con X filas y siete columnas (p, q, r, x, b, z y y). Tenía pensado inicialmente crear una matriz de ceros e ir llenando fila por fila, pero la verdad he tenido problemas al realizar el llenado.

Este es mi código:

from numpy.linalg import*;
numero_x_=raw_input("Teclea el numero:");
numero_x=int(numero_x_);
lista=zeros((numero_x,7));
print lista;
print lista.shape;
if numero_x>0:;
    for i in range(numero_x):;
        p_=raw_input("p: ");
        p=int(p_)
        q_=raw_input("q: ");
        q=int(q_);
        r_=raw_input("r: ");
        r=float(r_);
        x_=raw_input("x: ");
        x=float(x_);
        b_=raw_input("b:");
        b=float(b_);
        z=complex(r,x);
        y=1/z;
        y_info=array(([[p,q,r,x,b,z,y]]));
        print type(y_info);
        print y_info.shape;

solución

Si he entendido bien, quieres tener una matriz de X x 7 elementos.

Si a priori sabes el número de filas que vas a tener lo más sencillo sería inicializar el array de ceros así:

mi_arr = np.zeros((X, 7))

Si no sabes el número de filas que vas a tener es más sencillo usar una lista de listas y después convertirlo a un np.ndarray. En este caso parece que sí está claro.

Por otra parte, tienes varias columnas que son int, varias que son float y varias que son complex por lo que tienes que usar un tipo de contenedor que no sea homogéneo y en numpy el único que hay es un numpy.recarray (structured array), que es algo parecido a un DataFrame en pandas (salvando las distancias). Por tanto, para crear tu array heterogéneo puedes hacer…

Modificando un poco tu código y comentando algunas cosas:

# Nunca hagas este tipo de imports puesto que pierdes la traza
# de donde viene cada cosa y puedes contaminar el espacio
# de nombres obteniendo efectos indeseados
# from numpy.linalg import*;
import numpy as np
x = int(input("Teclea el número de filas:"))
mi_arr = np.array(
    np.zeros((x)), 
    dtype = [
        ('p', int),
        ('q', int),
        ('r', float),
        ('x', float),
        ('b', float),
        ('z', complex),
        ('y', complex)
    ]
) 
for i in range(x):
    p_ = input("p: ")
    mi_arr['p'][i] = int(p_)
    q_ = input("q: ")
    mi_arr['q'][i] = int(q_)
    r_ = input("r: ")
    mi_arr['r'][i] = float(r_)
    x_ = input("x: ")
    mi_arr['x'][i] = float(x_)
    b_ = input("b:")
    mi_arr['b'][i] = float(b_)
    mi_arr['z'][i] = complex(mi_arr['r'][i], mi_arr['x'][i])
    mi_arr['y'][i] = 1. / mi_arr['z'][i]
print(mi_arr)

Reitero, si lo he entendido bien, lo anterior haría lo que necesitas. Algunas cosas a comentar de tu código.

  • En Python no hay que terminar las líneas con ;. Ese símbolo se usa solo para varias declaraciones en la misma línea, por ejemplo, x = 1; y = 2.
  • Ten cuidado con el operador división en python 2.x ya que puede tener efectos indeseados. En mi código (penúltima línea) he puesto 1. / ... en lugar de 1 / ....
  • El código que he puesto es compatible con Python 2.x y Python 3.x pero input, range, /,…, no funcionan exactamente igual.
  • Estamos en 2016, deberías considerar seriamente la opción de usar python 3.x
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *