2016-06-12 19 views
-2

Ich schreibe diese Frage, weil ich nicht sicher bin mit der Verwendung von "Struktur-Arrays". Ich habe eine Matrix von der Tastatur mit verschiedenen Eingaben (Integer, Float, etc.) mit dem Befehl "dtype" gemacht. Dann möchte ich wiederholte Elemente in der Spalte "p" und "q" finden, wenn ich diese Elemente habe, möchte ich die entsprechenden Elemente aus der Spalte "z" summieren. Vielen Dank. Das ist mein Python-Code:Wie verwendet man Struktur-Arrays in Python?

from numpy import * 
from math import * 
from cmath import * 
from numpy.linalg import * 
number_lines_=raw_input("Lines:") 
numero_lines=int(number_lines_) 
ceros=zeros((numero_lines,1)) 
dtype=([('p',int),('q',int),('r',float),('x',float),('b',complex),('z',complex),('y',complex)]) 
#print dtype 
leng=len(dtype) 
#print leng 
yinfo=array(ceros,dtype) 
#print shape(yinfo) 
if numero_lines>0: 
    for i in range(numero_lines): 
     p_=raw_input("P: ") 
     p=int(p_) 
     if p>0: 
      yinfo['p'][i]=p 
      #print yinfo 
      q_=raw_input("Q: ") 
      q=int(q_) 
      if q>0 and q!=p: 
       yinfo['q'][i]=q 
       r_=raw_input("R: ") 
       r=float(r_) 
       yinfo['r'][i]=r 
       x_=raw_input("X: ") 
       x=float(x_) 
       yinfo['x'][i]=x 
       b_=raw_input("b:") 
       b=complex(b_) 
       yinfo['b'][i]=complex(0,b) 
       yinfo['z'][i]=complex(yinfo['r'][i],yinfo['x'][i]) 
       yinfo['y'][i]=1./(yinfo['z'][i]) 
# print "\n" 
print yinfo 
print type(yinfo) 
print yinfo.shape 

Antwort

0

Lassen Sie mich einige Änderungen vorschlagen:

import numpy as np # not * 
.... 
numero_lines=int(number_lines_) 
... 
# don't use numpy function names as variable names 
# even the np import 
dt=np.dtype([('p',int),('q',int),('r',float),('x',float),('b',complex),('z',complex),('y',complex)]) 
... 
yinfo=np.zeros((numero_lines,),dtype=dt) 
# make a zero filled array directly 
# also make it 1d, I don't think 2nd dimension helps you 
# if numero_lines>0: omit this test; range(0) is empty 

# link each of the fields to a variable name 
# changing a value of yinfo_p will change a value in yinfo 
yinfo_p=yinfo['p'] 
yinfo_q=yinfo['q'] 
# etc 

for i in range(numero_lines): 
    p_=raw_input("P: ") 
    p=int(p_) 
    if p>0: 
     yinfo_p[i]=p 
     #print yinfo 
     q_=raw_input("Q: ") 
     q=int(q_) 
     if q>0 and q!=p: 
      yinfo_q[i]=q 
      r_=raw_input("R: ") 
      r=float(r_) 
      yinfo_r[i]=r 
      x_=raw_input("X: ") 
      x=float(x_) 
      yinfo_x[i]=x 
      b_=raw_input("b:") 
      b=complex(b_) 
      yinfo_b[i]=complex(0,b) 

# dont need to fill in these values row by row 
# perform array operations after you are done with the input loop 
yinfo_z[:] = yinfo_r + 1j*yinfo_x 
yinfo_y[:] = 1./yinfo_z 

Alternativ könnte ich

definiert haben in allen yinfo_* Werte
yinfo_p = np.zeros((numero_lines,), dtype=int) 
yinfo_q = ... 

Nach dem Befüllen ich sie in zusammenbauen könnte ein strukturiertes Array - wenn ich das für andere Zwecke brauche.

yinfo['p'] = yinfo_p 
etc. 

Dies ist keine sehr gute Verwendung von strukturierten Arrays; Wie ich versucht habe, mit den yinfo_b Variablen zu zeigen, benutzen Sie jedes Feld, als ob es ein getrenntes 1d Feld war.

Ich habe diese Änderungen nicht wirklich ausgeführt, daher könnte es einige Fehler geben, aber hoffentlich werden sie Ihnen Ideen geben, die Ihren Code verbessern können.

Verwandte Themen