การพิมพ์อาร์เรย์ Numpy [ปิด]

Nov 03 2020

ฉันกำลังพยายามพิมพ์ผลลัพธ์ของการคำนวณก่อนหน้านี้และมีปัญหาบางอย่างในการใช้ Numpy เพื่อพิมพ์ค่าออกจากอาร์เรย์อย่างถูกต้อง ตัวแปรแต่ละตัวในลูปถูกกำหนดโดยการคำนวณก่อนหน้านี้และจำเป็นต้องเรียกใช้ผ่านการเรียงลำดับความเร็วเพื่อรับข้อมูลสำหรับแต่ละความเร็วโดยเพิ่มขึ้นทีละ 5kn

รหัสที่เป็นปัญหาคือ:

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]),)

คำตอบ

AdamKern Nov 03 2020 at 22:39

ถูกต้องฉันคิดว่าฉันเข้าใจแล้วว่าเป้าหมายคืออะไร สิ่งที่คุณมีคืออาร์เรย์ 1D ทั้งกลุ่มซึ่งหมายความว่าแต่ละอันแทนเวกเตอร์ (เมื่อเทียบกับเมทริกซ์หรือเทนเซอร์) เป้าหมายของคุณคือพิมพ์ค่าเหล่านั้นในตารางด้วยวิธีที่เฉพาะเจาะจง มันดูเหมือนว่าฉันว่าการแก้ไขอย่างรวดเร็วคือการเปลี่ยนprint(kFrm, end="")ไปใช้การประชุมเช่นเดียวกับทุกงานพิมพ์อื่น ๆprint('{:12.4f}'.format(kFrm[i]), end=''): กำจัดnp.set_printoptions()สายหลังจากนั้น

เหตุใดจึงเกิดขึ้น ฉันเชื่อว่ารหัสปัจจุบันของคุณบางส่วนมาจากการสนทนาก่อนหน้านี้ แต่ไม่มีบริบททั้งหมด kFrmเป็นเวกเตอร์เช่นเดียวกับตัวแปรอื่น ๆ ทั้งหมดที่คุณใช้งานดังนั้นคุณเพียงแค่ต้องการพิมพ์i'thค่าของเวกเตอร์นั้นในแถวนั้น ถ้าคุณอยากจะพิมพ์เวกเตอร์ทั้งหมดเป็นแถวเดียวแล้วคุณต้องการใช้รหัสที่เป็นอยู่ในขณะนี้

ตามบันทึกข้างคุณอาจจะสามารถที่จะช่วยตัวเองปวดหัวบางคน (หรือเนื้อหาแนะนำมากขึ้นของอาการปวดหัว) โดยใช้หมีแพนด้า หากคุณทำคุณสามารถทำสิ่งต่างๆดังต่อไปนี้ สิ่งเดียวที่จับได้คือคุณไม่สามารถตั้งชื่อคอลัมน์ให้เหมือนกันได้ดังนั้นคุณต้องตั้งชื่อคอลัมน์แรกและคอลัมน์ที่สองของคุณVและVSแทนที่จะเป็นVและ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)

สิ่งนี้ช่วยให้คุณ:

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

ทำไมต้องผ่านปัญหาทั้งหมดนี้ด้วยpandas? ฉันขอยืนยันว่าเราทำเช่นนั้นเพราะpandasและnumpyได้ทำงานจำนวนมากเพื่อให้สิ่งต่างๆพิมพ์ออกมาได้ดี ยิ่งเราสามารถใช้ประโยชน์จากงานนั้นได้มากเท่าไหร่เราก็ยิ่งมั่นใจได้มากขึ้นว่าผลลัพธ์ของเราจะแข็งแกร่งและดูดีจริงๆ อย่างไรก็ตามคุณสามารถตัดสินใจที่จะเพิกเฉยต่อครึ่งหลังของคำตอบนี้และฉันจะไม่ถือมันกับคุณ