【问题标题】:Printing a Numpy Array [closed]打印一个 Numpy 数组 [关闭]
【发布时间】:2020-11-03 20:31:18
【问题描述】:

我正在尝试打印一些先前计算的结果,并且在使用 Numpy 正确打印数组中的值时遇到了一些问题。循环中的每个变量都是由之前的计算定义的,它需要通过速度排列来获得每个速度以 0.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]),)

【问题讨论】:

  • 关于新问题的好电话......你能澄清一下变量的样子吗?具体来说,Vskn.shapekFrm.shape的输出是什么,kFrmin是单个数字吗?
  • 我不知道你在问什么...只是表格的样子还是数字是如何生成的?
  • 更多表格的外观。我假设VsknkFrmnumpy 数组。我的问题是,它们是 1D 阵列还是 2D/3D/ND 阵列?如果您可以举一个两行示例来说明您希望表格的外观,那将非常有帮助
  • 我已将所有程序文件上传到 gethub github.com/StumbleNOLA/Hollenbachs-method,这样您就可以看到整体,而不仅仅是点点滴滴。

标签: arrays numpy printing


【解决方案1】:

好吧,好吧,我想我明白这里的目标是什么了。你所拥有的是一大堆一维数组——这意味着每个数组都代表一个向量(与矩阵或张量相比)。您的目标是以非常具体的方式在表格中打印这些值。在我看来,快速解决方法是更改​​print(kFrm, end="") 以使用与所有其他打印相同的约定:print('{:12.4f}'.format(kFrm[i]), end='')。在此之后摆脱np.set_printoptions() 调用。

为什么会这样?我相信您当前的代码部分基于以前的对话,但没有完整的上下文。 kFrm 是一个向量,就像您正在使用的所有其他变量一样,因此您只想在该行中打印该向量的 i'th 值。如果您想将整个向量打印为单行,那么您可以使用现在的代码。

作为旁注,您可以使用pandas 来避免一些头痛(或者,可以说,引入更多的头痛)。如果你这样做,你可以做类似下面的事情。唯一的问题是您不能将列命名为相同的东西,因此您必须将第一列和第二列命名为 VVS,而不是 VV

# 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 来解决所有这些麻烦?我认为我们这样做是因为pandasnumpy 已经完成了大量工作以使打印效果更好。我们越能利用这项工作,我们就越有信心我们的输出将是强大的并且看起来真的很好。但是,您也可以决定忽略此答案的后半部分,我真的不会反对您。

【讨论】:

  • 非常感谢!如前所述,我只是选择了第一个选项。如果我必须重新创建它,我会做很多不同的事情,但在这一点上,这是一个沉没成本问题。我在完全没有编码经验的情况下开始了这个项目,所以我不得不把它全部弄清楚(这门课不是关于编码的)。因此,返回并重做所有工作的想法......很困难。
  • 哈哈好吧,我们就是这样学习的,对吧?很高兴你成功了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多