file_1.dat, file_2.dat ...... Il s'agit d'une méthode pour lire un fichier dat tel que file_100.dat dans lequel seuls les nombres changent continuellement en utilisant l'instruction for, le traitent et le représentent graphiquement. Je n'ai pas trouvé d'explication cohérente, alors je vais la laisser sous forme de mémorandum.
Il existe des dizaines de fichiers dat avec n lignes et 2 colonnes comme celui-ci, et je veux extraire uniquement les valeurs de la deuxième colonne, les calculer et les représenter graphiquement. Si vous copiez et collez un fichier à la fois dans Excel, cela prendra beaucoup de temps et d'efforts.
Au départ, c'était un programme qui lisait chaque fichier, le traitait, l'attribuait aux valeurs x, y, etc.
data_number_1,data_intensity_1 = np.loadtxt("file_1.dat",unpack = True)
s1 = su(data_intensity_1)
m1 = mean(data_intensity_1)
x=[s1]
y=[m1]
C'était un programme qui répétait cela pour le nombre de fichiers, qui était un nombre ridiculement grand de lignes et de volumes, mais comme mentionné au début, les noms de fichiers ne diffèrent que par les nombres, il est donc facile d'utiliser l'instruction for en Python Peut-il être traité? Telle était la motivation pour réfléchir au programme.
<Environnement utilisé> spyder(python3.7) Calcul: numpy (importer numpy comme np) Dessin: matplotrib (import matplotlib.pyplot as plt)
Utilisez np.loadtext pour charger le fichier dat. Référence: https://deepage.net/features/numpy-loadsavetxt.html
L'exemple de code utilisé pour le chargement est le suivant. Ici, on suppose que les fichiers de numéro de série du fichier_1 au fichier_20 sont lus.
data = []
for i in range(1,21):
data.append(np.loadtxt("file_{}.dat".format(i),usecols=(1),unpack=True))
Le code est expliqué étape par étape ci-dessous.
Lors de la définition de la plage de i dans l'instruction for, la plage de ** valeur maximale-1 ** est appliquée, donc cette fois, définissez la plage sur (1,21) comme numéro de fichier 20 + 1.
Étant donné que le nom de fichier est file_ ** number **. Dat, utilisez la méthode format et faites-le comme ** file_ {} .dat ".format (i) **. En faisant cela, un traitement en boucle tel que file_1.dat, file_2.dat ... peut être effectué.
Ensuite, la valeur du processus répété par ** data.append ** est ajoutée à la liste appelée data qui les a créés, et ainsi de suite.
Du fichier dat, je veux gérer uniquement la valeur de la deuxième ligne en tant que valeur numérique, je dois donc ajouter un traitement pour cela.
Si vous lisez la valeur numérique en utilisant loadtext telle quelle, elle sera placée dans la liste ligne par ligne telle que [0.0 72925], [1.0 70740] ... [10.0 73343] dans l'exemple de l'image précédente.
J'utilise donc ** unpack ** pour le transposer et le mettre dans une variable différente pour chaque colonne. En le définissant sur True, la translocation se produit et la liste peut avoir différentes variables pour chaque colonne telles que [0.0 1.0 ... 10.0], [72925 70740 ... 73343].
De plus, puisque nous voulons traiter uniquement la deuxième colonne comme une valeur numérique sans utiliser la première colonne, spécifiez la ligne à lire par ** usecols . Puisque nous avons décidé quelle ligne lire 0 comme première ligne, nous devons le faire comme ( 1 **) lors de la lecture de la deuxième colonne. De cette façon, la liste de données ne contiendra que [72925 70740 ... 73343].
Pour plus de détails, veuillez consulter le site de référence affiché ci-dessus. En utilisant unpack et usecols de cette manière, j'ai pu ne mettre que la deuxième colonne dans une variable pour chaque fichier.
data = [2ème colonne du fichier_1, 2ème colonne du fichier_2, ..., 2ème colonne du fichier_20].
Dans le programme d'origine, ce n'était que ce qui était tapé dans la branche fichier! Le nombre de lignes et le nombre de caractères sont étonnamment réduits. Bien sûr, plus vous avez de fichiers, plus ce sera facile.
De cette manière, nous avons pu capturer toutes les phrases de fichier pour uniquement les valeurs de la deuxième ligne, nous allons donc traiter chacune d'elles ensuite. Afin de traiter par lots les valeurs de la liste, définissez une fonction et traitez-les dans l'ordre.
Cette fois, supposons que l'axe horizontal est la somme des valeurs de chaque fichier et que l'axe vertical est la valeur moyenne.
Chaque définition de fonction peut être écrite comme suit.
def su(a):
return np.sum(a)
def mean(a):
return np.mean(a)
Appliquez ces processus individuellement aux données de la liste.
for i in range(1,21):
si = su(data[i-1])
mi = mean(data[i-1])
Une chose à noter ici est la valeur de la plage. Les noms de fichiers commencent à 1, mais les valeurs de la liste commencent à 0. Par conséquent, lorsque vous spécifiez la valeur de i dans la fonction, il est nécessaire de le faire comme ** (i-1) **.
Cela signifie que vous devez définir la valeur que vous pensez être comprise entre 1 et 20 dans la plage de 0 à 19.
Je vais omettre l'explication détaillée cette fois. Si vous recherchez avec matplotrib, vous trouverez diverses explications.
Il est nécessaire de définir les valeurs calculées par la méthode de traitement ci-dessus comme x et y, respectivement. Par conséquent, faites une liste de la même manière que lors de la lecture d'un fichier et mettez les valeurs traitées dans la liste x, y dans l'ordre.
x=[]
y=[]
for i in range(1,21):
si = sum(data[i-1])
mi = mean(data[i-1])
x.append(si)
y.append(mi)
En faisant cela, nous avons pu préparer les valeurs de l'axe des x et de l'axe des y, et le reste est complété en créant un graphique à l'aide de plot.
Sur la base de ce qui précède, l'ensemble du code est le suivant. (Les valeurs, fichiers et graphiques sont préparés sous forme d'échantillons et n'ont aucune signification.)
import numpy as np
import matplotlib.pyplot as plt
def su(a):
return np.sum(a)
def mean(a):
return np.mean(a)
data = []
for i in range(1,21):
data.append(np.loadtxt("file_{}.dat".format(i),usecols=(1),unpack=True))
x=[]
y=[]
for i in range(1,21):
si = su(data[i-1])
mi = mean(data[i-1])
x.append(si)
y.append(mi)
plt.plot(x,y,ls="",marker="o");
plt.xlim(xmin=0)
plt.ylim(ymin=0)
plt.show()
En utilisant le traitement en boucle de cette manière, nous avons réussi à simplifier plus de 100 lignes et l'efficacité s'est considérablement améliorée! J'espère que cela sera utile pour ceux qui souffrent de problèmes similaires.
Merci pour la lecture.
Recommended Posts