Stampa di un array Numpy [chiuso]
Sto cercando di stampare i risultati di alcuni calcoli precedenti e sto riscontrando alcuni problemi con Numpy per stampare correttamente i valori da un array. Ciascuna delle variabili nel ciclo è definita in precedenza da calcoli e deve essere eseguita attraverso le permutazioni di velocità per ottenere i dati per ciascuna velocità in incrementi di 0,5 kN.
Il codice in questione è:
print('Speed Dependent factors and residuary resistance coefficents')
#output table
#table header
#Top Row
print('V'.center(12),end='') #the end='' prevents a new line'
print('V'.center(12),end='')
print('FN'.center(12),end='')
print('CRstdmin'.center(12),end='')
print('kFrmin'.center(12),end='')
print('CRBTmin'.center(12),end='')
print('CRmin'.center(12),end='')
print('CRstdmean'.center(12),end='')
print('kFrmean'.center(12),end='')
print('CRBTmean'.center(12),end='')
print('CRmean'.center(12),)
#Second Row
print('knots'.center(5),end='')
print('m/s'.center(12), end='')
print('--'.center(12), end='')
print('--'.center(12), end='')
print('--'.center(12), end='')
print('--'.center(12), end='')
print('10^-3'.center(12), end='')
print('--'.center(12), end='')
print('--'.center(12), end='')
print('--'.center(12), end='')
print('10^-3'.center(12))
print('-'*135)
#loop for table cell values
kFrmin=round(kFrmin,5)
for i in range(len(VS)):
print('{:12.1f}'.format(Vskn[i]), end='')
print('{:12.3f}'.format(VS[i]), end='')
print('{:12.4f}'.format(FN[i]), end='')
print('{:12.4f}'.format(CRstdmin[i]), end='')
print('{:12.4f}'.format(kFrmin), end='')
print('{:12.4f}'.format(CRBTmin[i]), end='')
print('{:12.4f}'.format(CRmin[i]), end='')
print('{:12.4f}'.format(CRstdm[i]), end='')
print(kFrm, end="")
np.set_printoptions()
#print('{:12.4f}'.format(kFrm), end='')
print('{:12.4f}'.format(CRBTm[i]), end='')
print('{:12.4f}'.format(CRm[i]),)
Risposte
Bene, ok, penso di aver capito qual è l'obiettivo qui. Quello che hai sono un intero gruppo di array 1D, il che significa che ognuno rappresenta un vettore (rispetto a una matrice o un tensore). Il tuo obiettivo è stampare quei valori in una tabella in un modo molto specifico. Mi sembra che la soluzione rapida è quella di cambiare print(kFrm, end="")per utilizzare la stessa convenzione come tutte le altre stampe: print('{:12.4f}'.format(kFrm[i]), end=''). Dopodiché, sbarazzati della np.set_printoptions()chiamata.
Perché sta succedendo? Credo che il tuo codice attuale sia parzialmente basato su una conversazione precedente, ma senza il contesto completo. kFrmè un vettore proprio come tutte le altre variabili con cui stai lavorando, quindi vuoi solo stampare il i'thvalore di quel vettore in quella riga. Se avessi voluto stampare l'intero vettore come una singola riga, allora dovresti usare il codice così com'è in questo momento.
Come nota a margine, potresti essere in grado di risparmiarti un po 'di mal di testa (o, probabilmente, introdurre più di un mal di testa) usando i panda . Se lo fai, potresti fare qualcosa come di seguito. L'unico problema è che non puoi nominare le colonne nello stesso modo, quindi devi nominare la prima e la seconda colonna Ve VS, invece di Ve V:
# At the top of your file
import pandas as pd
# All the other stuff
...
kFrmin = round(kFrmin,5)
# Create the data frame,
# mapping name to vector.
# Each entry here represents
# a column in the eventual output
dataframe = pd.DataFrame({
"V": Vskn,
"VS": VS,
"FN": FN,
"CRstdmin": CRstdmin,
"kFrmin": float(kFrmin), # kFrmin is defined as an int in your
"CRBTmin": CRBTmin, # code, we need a float
"CRmin": CRmin,
"CRstdmean": CRstdm,
"kFrmean": kFrm,
"CRBTmean": CRBTm,
"CRmean": CRm,
})
# Set some options for printing
with pd.option_context(
"display.max_columns", 11, # Display all columns
"display.expand_frame_repr", False, # Don't wrap columns
"display.float_format", "{:>12.4f}".format, # Default to 4 digits of precision,
): # pad to 12 places
df_str = dataframe.to_string(
index=False, # Don't print the dataframe index
formatters={
"V": "{:>12.1f}".format, # V uses 1 digit of precision
"VS": "{:>12.3f}".format, # VS uses 3 digits of precision
}
)
# Everything from here... (see below)
df_str_rows = df_str.split("\n") # Split up the original table string
# Create the unit row values
unit_row = ["knots", "m/s", "--", "--", "--", "--", "10^-3", "--", "--", "", "10^-3"]
# Pad them using right justification
pd_cspace = pd.get_option("column_space")
unit_row_str = (unit_row[0].rjust(pd_cspace) +
''.join(r.rjust(pd_cspace + 1) for r in unit_row[1:]))
# Insert that new row back into the table string
df_str_rows.insert(1, unit_row_str)
df_str_rows.insert(2, "-" * len(unit_row_str))
df_str = '\n'.join(df_str_rows)
# ... to here was just to include the extra unit row
# and the dash line separating the table. You could ignore
# it if you don't care about those
# Ok now print
print('Speed Dependent factors and residuary resistance coefficents')
print(df_str)
Questo ti dà:
Speed Dependent factors and residuary resistance coefficents
V VS FN CRstdmin kFrmin CRBTmin CRmin CRstdmean kFrmean CRBTmean CRmean
knots m/s -- -- -- -- 10^-3 -- -- -- 10^-3
----------------------------------------------------------------------------------------------------------------------------------------------
15.0 7.717 0.1893 0.8417 1.0000 0.1870 0.7645 0.8417 1.0000 0.1786 0.7302
15.5 7.974 0.1956 0.8928 1.0000 0.1984 0.8110 0.8928 1.0000 0.1895 0.7746
16.0 8.231 0.2019 0.9502 1.0000 0.2111 0.8631 0.9502 1.0000 0.2017 0.8243
16.5 8.488 0.2083 1.0138 1.0000 0.2253 0.9208 1.0138 1.0000 0.2152 0.8795
17.0 8.746 0.2146 1.0837 1.0000 0.2408 0.9843 1.0837 1.0000 0.2300 0.9401
17.5 9.003 0.2209 1.1598 1.0000 0.2577 1.0535 1.1598 1.0000 0.2461 1.0062
18.0 9.260 0.2272 1.2422 1.0000 0.2760 1.1283 1.2422 1.0205 0.2690 1.0997
18.5 9.517 0.2335 1.3308 1.0000 0.2957 1.2088 1.3308 1.0508 0.2968 1.2132
19.0 9.774 0.2398 1.4257 1.0000 0.3168 1.2950 1.4257 1.0829 0.3276 1.3394
19.5 10.032 0.2461 1.5269 1.0000 0.3393 1.3869 1.5269 1.1167 0.3619 1.4793
20.0 10.289 0.2524 1.6343 1.0000 0.3631 1.4845 1.6343 1.1525 0.3997 1.6340
Perché affrontare tutti questi guai con pandas? Direi che lo facciamo perché pandase numpyabbiamo fatto un enorme lavoro per far stampare bene le cose. Più riusciamo a sfruttare quel lavoro, più possiamo essere sicuri che il nostro output sarà robusto e avrà un bell'aspetto. Tuttavia, potresti anche decidere di ignorare la seconda metà di questa risposta e davvero non te la terrei contro.