web-dev-qa-db-fra.com

Des tableaux ND à 1D

Disons que j'ai un tableau a:

a = np.array([[1,2,3], [4,5,6]])

array([[1, 2, 3],
       [4, 5, 6]])

Je voudrais le convertir en tableau 1D (c’est-à-dire un vecteur colonne):

b = np.reshape(a, (1,np.product(a.shape)))

mais cela retourne

array([[1, 2, 3, 4, 5, 6]])

ce qui n'est pas la même chose que:

array([1, 2, 3, 4, 5, 6])

Je peux prendre le premier élément de ce tableau pour le convertir manuellement en un tableau 1D:

b = np.reshape(a, (1,np.product(a.shape)))[0]

mais cela nécessite de connaître le nombre de dimensions du tableau d'origine (et de concaténer les valeurs de [0] lorsque vous travaillez avec des dimensions plus élevées).

Existe-t-il un moyen, indépendant des dimensions, d’obtenir un vecteur colonne/ligne d’un ndarray arbitraire?

86

Utilisez np.ravel (pour une vue 1D) ou np.flatten (pour une copie 1D) ou np.flat (pour un itérateur 1D):

In [12]: a = np.array([[1,2,3], [4,5,6]])

In [13]: b = a.ravel()

In [14]: b
Out[14]: array([1, 2, 3, 4, 5, 6])

Notez que ravel() renvoie une view de a lorsque cela est possible. Donc, modifier b modifie également a. ravel() renvoie une view lorsque les éléments 1D sont contigus en mémoire, mais renverrait une copy si, par exemple, a a été créé en découpant un autre tableau en utilisant une taille d'étape non unité (par exemple, a = x[::2]).

Si vous voulez une copie plutôt qu'une vue, utilisez

In [15]: c = a.flatten()

Si vous voulez juste un itérateur, utilisez np.flat:

In [20]: d = a.flat

In [21]: d
Out[21]: <numpy.flatiter object at 0x8ec2068>

In [22]: list(d)
Out[22]: [1, 2, 3, 4, 5, 6]
189
unutbu
In [14]: b = np.reshape(a, (np.product(a.shape),))

In [15]: b
Out[15]: array([1, 2, 3, 4, 5, 6])

ou simplement:

In [16]: a.flatten()
Out[16]: array([1, 2, 3, 4, 5, 6])
18
NPE

Bien que cela n’utilise pas le format de tableau np, (trop paresseux pour modifier mon code), cela devrait faire ce que vous voulez ... Si vous voulez vraiment un vecteur colonne, vous voudrez transposer le résultat du vecteur. Tout dépend de la manière dont vous envisagez de l'utiliser.

def getVector(data_array,col):
    vector = []
    imax = len(data_array)
    for i in range(imax):
        vector.append(data_array[i][col])
    return ( vector )
a = ([1,2,3], [4,5,6])
b = getVector(a,1)
print(b)

Out>[2,5]

Donc si vous avez besoin de transposer, vous pouvez faire quelque chose comme ceci:

def transposeArray(data_array):
    # need to test if this is a 1D array 
    # can't do a len(data_array[0]) if it's 1D
    two_d = True
    if isinstance(data_array[0], list):
        dimx = len(data_array[0])
    else:
        dimx = 1
        two_d = False
    dimy = len(data_array)
    # init output transposed array
    data_array_t = [[0 for row in range(dimx)] for col in range(dimy)]
    # fill output transposed array
    for i in range(dimx):
        for j in range(dimy):
            if two_d:
                data_array_t[j][i] = data_array[i][j]
            else:
                data_array_t[j][i] = data_array[j]
    return data_array_t
0
xcellsior

Pour une liste de tableaux de taille différente, utilisez ce qui suit:

// ND array list with different size
a = [[1],[2,3,4,5],[6,7,8]]

// stack them
b = np.hstack(x)

print(b)

Sortie:

[1 2 3 4 5 6 7 8]

0
Bikram Pandit

Un des moyens les plus simples consiste à utiliser flatten(), comme dans l'exemple suivant:

 import numpy as np

 batch_y =train_output.iloc[sample, :]
 batch_y = np.array(batch_y).flatten()

Mon tableau était comme ça:

    0
0   6
1   6
2   5
3   4
4   3
.
.
.

Après avoir utilisé flatten():

array([6, 6, 5, ..., 5, 3, 6])

C'est aussi la solution d'erreurs de ce type:

Cannot feed value of shape (100, 1) for Tensor 'input/Y:0', which has shape '(?,)' 
0
DINA TAKLIT