¿Cómo puedo extender esta función para tomar un número no especificado de matrices A, B (todas con la misma dimensión)?

def fun(A, B):
    a = list()
    b = list()

    axis1 = len(A[:, 0])
    axis2 = len(A[0, :])

    for j in range(0, axis2):
        for i in range(0, axis1):
            a.append(A[i, j])
            b.append(B[i, j])

    return a, b
1
Tom 14 ene. 2017 a las 02:58

3 respuestas

La mejor respuesta

Básicamente, está copiando elementos de cada matriz de parámetros en una nueva lista utilizando las dimensiones de la primera matriz. Lo siguiente explica el corte de Numpy para lograr el mismo resultado:

def func(*args):
    axis1, axis2 = args[0].shape
    return tuple(arr[:axis1, :axis2].flatten().tolist() for arr in args)

A = np.array([[1,2], [3,4]])
B = np.array([[6,8, 5], [9,0, 3], [2,5,7]])

print(fun(A,B))
# ([1, 3, 2, 4], [6, 9, 8, 0])
print(func(A,B))
# ([1, 3, 2, 4], [6, 9, 8, 0])
1
Moses Koledoye 14 ene. 2017 a las 00:27

En lugar de enviar un número fijo de matrices, envíe una lista de matrices. Luego, agregue una profundidad de bucle adicional donde los elementos se copian de una matriz a la lista correspondiente.

Además, considere usar la propiedad shape para obtener las dimensiones de su matriz.

def fun(matrices):

    lists = []
    for m in range(len(matrices)):
        lists.append([])

    axis1 = matrices[0].shape[0]
    axis2 = matrices[0].shape[1]

    for j in range(0, axis2):
        for i in range(0, axis1):
            for m in range(len(matrices)):
                lists[m].append(matrices[m][i, j])

    return lists

# usage
A = np.matrix([[0, 1], [2, 3]])
B = np.matrix([[4, 5], [6, 7]])
print(fun([A,B])) # returns [[0, 2, 1, 3], [4, 6, 5, 7]]
1
dana 14 ene. 2017 a las 00:32

Puede pasar múltiples argumentos (un número desconocido) a una función usando * args.
Eche un vistazo a https://pythontips.com / 2013/08/04 / args-and-kwargs-in-python-shown /

Entonces harás algo como

def fun(*args):
    for arg in args:
        ...
1
Dan Vanatta 14 ene. 2017 a las 00:04