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?
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]
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])
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
// ND array list with different size
a = [[1],[2,3,4,5],[6,7,8]]
// stack them
b = np.hstack(x)
print(b)
[1 2 3 4 5 6 7 8]
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 '(?,)'