Je lis des données et j'essaie de créer un tableau de formes NumPy (194, 1). Il devrait donc ressembler à: [[4], [0], [9], ...]

Je fais ça:

def parse_data(file_name):
    data = []
    target = []
    with open(file_name) as f:
        for line in f:
            temp = line.split()
            x = [float(x) for x in temp[:2]]
            y = float(temp[2])
            data.append(np.array(x))
            target.append(np.array(y))
    return np.array(data), np.array(target)

x, y = parse_data("data.txt")

Lorsque j'inspecte y.shape, c'est (194,), pas (194,1) comme je m'y attendais.

Le x a la forme (194,2) comme je m'y attendais cependant.

Une idée de ce que je fais mal?

Merci!

1
bclayman 12 avril 2018 à 23:18

3 réponses

Meilleure réponse

Vous semblez vous attendre à ce que np.array(y) transforme automatiquement votre scalaire y en une ligne à 1 élément. Ce n'est pas ainsi que NumPy fonctionne.

np.array(y) est à 0 dimension . Mettre un groupe de ceux-ci dans une liste et appeler array sur la liste produit un résultat unidimensionnel, pas un résultat bidimensionnel.

3
user2357112 supports Monica 12 avril 2018 à 20:27

Lorsque np.array() est appelé sur une liste de tableaux numpy construits à partir de scalaires, il les concatène puis crée un tableau numpy, vous donnant votre forme (194,).

Vous pouvez toujours remodeler y à la forme souhaitée:

def parse_data(file_name):
    data = []
    target = []
    with open(file_name) as f:
        for line in f:
            temp = line.split()
            x = [float(x) for x in temp[:2]]
            y = float(temp[2])
            data.append(np.array(x))
            target.append(y)
    return np.array(data), np.array(target).reshape(-1, 1)

x, y = parse_data("data.txt")

Bien sûr, vous pouvez également résoudre votre problème avec:

target.append(np.array([y]))

Un exemple du comportement que j'ai déclaré ci-dessus:

import numpy as np
a = np.array(5)
b = np.array(4)
v = [a, b]
v
>>>[array(5), array(4)]
np.array(v)
>>>array(5, 4) #arrays are concatenated
1
Primusa 12 avril 2018 à 20:49

Je sauterais le np.array dans l'itération.

def parse_data(file_name):
    data = []
    target = []
    with open(file_name) as f:
        for line in f:
            temp = line.split()
            x = [float(x) for x in temp[:2]]
            y = float(temp[2])
            data.append(x)
            target.append(y)
    return np.array(data), np.array(target)

Cela créerait data comme:

 [[1.0, 2.0],[3.0, 4.0], ....]

Et target comme

 [1.2, 3.2, 3.1, ...]

np.array(data) transforme ensuite la liste des listes en tableau 2d et la liste des nombres en tableau 1d.

Il est ensuite facile de remodeler ou d'ajouter une dimension au 1d, ce qui en fait (1, n) ou (n, 1) ou tout ce dont vous avez besoin.

N'oubliez pas que les méthodes de construction de base des tableaux sont:

np.array([1,2,3])             # 1d
np.array([[1,2],[3,4]])       # 2d
0
hpaulj 12 avril 2018 à 20:41