2017-05-13 1 views
0

J'ai un fichier testforce.dat qui affiche les valeurs divisées en 9 colonnes et 3 lignes. La première colonne 3 représente:Multiplication de matrices avec sélection de colonnes en alternance

p1 p2 p3 f1 f2 f3 r1 r2 r3  
18 5 27 20 21 8 14 12 25 
9 26 23 1 4 10 7 16 24 
19 22 15 13 17 6 11 2 3 

J'ai 100 fichiers de cette façon.
Je veux maintenant calculer pour le fichier force_00000.dat le vecteur g = [sum(p1*f1), sum(p2*f2), sum(p3*f3)] mais pour le prochain fichier force_00001.dat le vecteur doit utiliser d'autres colonnes h = [sum(p1*r1), sum(p2*r2), sum(p3*r3)]. Pour le moment, j'utilise la fonction glob pour lire mes fichiers dans des tableaux. Il place chaque rangée dans un tableau. Je ne sais pas comment obtenir mon tableau de multiplication alternatif fait et apprécierait des suggestions :)

import numpy as np 
import glob 

i = 100 
for x in range(0,int(i)): 


## turns x into a string and adds if necessary "0" to achieve a fixed digit number; 
y = str(x).zfill(5) 

## the structure of the forcefile is "force_[00000-00099]"; 
files = sorted(glob.glob('.//results/force/force_%s.dat' % y)) 
column_names=('#position') 


print files 

## loads the file data into arrays 
arrays=[np.loadtxt(filename) for filename in files] 
print arrays 

Edit: Je l'ai testé la charge du premier fichier avec:

b=np.array(arrays) 
print b.shape 

Et je reçois (1,3,9) pour la forme de mon tableau généré.

Edit2: I eu l'idée d'utiliser "usecols", puis multiplier les valeurs souhaitées:

xposition=[np.loadtxt(filename,usecols= (0,1,2)) for filename in files] 
xforce1=[np.loadtxt(filename,usecols= (3,4,5)) for filename in files] 
print xposition 
print xforce1 
xp=np.asarray(xposition) 
xf1=np.asarray(xforce1) 

print xp 
g=np.multiply(xp,xf1) 
print g 

ce a généré le résultat suivant:

[[[ 360. 105. 216.] 
[ 9. 104. 230.] 
[ 247. 374. 90.]]] 

ce qui signifie que j'ai (p11 et f11 étant les valeurs de la première rangée, p21 à partir de la deuxième rangée ...)

[[[p11*f11 p12*f12 p13*f13] 
[p21*f21 p22*f22 p23*f23] 
[p31*f31 p32*f32 p33*f33]]] 

qui ressemble à ce que je suis e pour au moins un fichier. Le g désiré (g1, g2, g3) devrait ressembler à:

p11*f11+p21*f21+p31*f31= g1 
p12*f12+p22*f22+p32*f32= g2 
p13*f13+p23*f23+p33*f33= g3 

Désolé si cela est une question tout à fait novice mais je ne suis pas si familliar python encore :)

Pour la question avec l'alternance valeurs Je pensais à l'aide d'une fonction if qui vérifie si "i" dans la boucle est un nombre pair

+0

Allons charger un fichier d'abord. Si vous obtenez les en-têtes correctement, vous devriez vous retrouver avec un tableau avec 3 lignes et 9 colonnes, c'est-à-dire. forme (3,9), et dtype de flotteur. Avez-vous cela? – hpaulj

+0

ok J'ai encore vérifié: avec >>> b = np.tableau (tableaux) >>> impression b.shape Je reçois (1,3,9) ... –

Répondre

0

loadtxt retourne un tableau. [loadtxt(name) for name in filenames] produit une liste de tableaux, un tableau par nom. np.array([...]) produit un tableau à partir de cette liste. Si les tableaux individuels sont tous de la même taille, le tableau résultant sera 3d.

Si vous devez traiter tous les fichiers différemment, vous pouvez y accéder comme un ensemble avec l'indexation

arr[::2,...] 
arr[1;:2,...] 

Pour multiplier les 2 ensembles de colonnes de votre fichier exemple:

In [558]: txt=b"""p1 p2 p3 f1 f2 f3 r1 r2 r3  
    ...: 18 5 27 20 21 8 14 12 25 
    ...: 9 26 23 1 4 10 7 16 24 
    ...: 19 22 15 13 17 6 11 2 3""" 

In [560]: arr = np.loadtxt(txt.splitlines(),skiprows=1,dtype=int) 
In [561]: arr 
Out[561]: 
array([[18, 5, 27, 20, 21, 8, 14, 12, 25], 
     [ 9, 26, 23, 1, 4, 10, 7, 16, 24], 
     [19, 22, 15, 13, 17, 6, 11, 2, 3]]) 

In [562]: arr[:, 0:3]*arr[:, 3:6] 
Out[562]: 
array([[360, 105, 216], 
     [ 9, 104, 230], 
     [247, 374, 90]]) 

In [563]: arr[:, 0:3]*arr[:, 6:9] 
Out[563]: 
array([[252, 60, 675], 
     [ 63, 416, 552], 
     [209, 44, 45]]) 

Si arr était un tableau 3d de charger plusieurs fichiers,

arr1 = arr[::2,...] 
arr2 = arr[1::2,...] 
arr1[:,:,0:3] * arr1[:,:,3:6] 
etc 
+0

Je l'ai essayé maintenant avec "usecols". Pourriez-vous s'il vous plaît vérifier mon edit2? Merci beaucoup pour votre soutien :) –

+0

'usecols' vous permet de sélectionner des colonnes pendant le chargement. Mais vous pouvez également sélectionner des colonnes dans le (s) tableau (s) après le chargement. – hpaulj

+0

exemple de multiplication de colonne ajouté. – hpaulj