arrays - 打印一个 Numpy 数组
问题描述
我正在尝试打印一些先前计算的结果,并且在使用 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]),)
解决方案
对,好吧,我想我明白这里的目标是什么了。你所拥有的是一大堆一维数组——这意味着每个数组都代表一个向量(与矩阵或张量相比)。您的目标是以非常具体的方式在表格中打印这些值。在我看来,快速解决方法是更改print(kFrm, end="")
为使用与所有其他打印相同的约定:print('{:12.4f}'.format(kFrm[i]), end='')
. 在那之后摆脱np.set_printoptions()
电话。
为什么会这样?我相信您当前的代码部分基于以前的对话,但没有完整的上下文。kFrm
是一个向量,就像您正在使用的所有其他变量一样,因此您只想i'th
在该行中打印该向量的值。如果您想将整个向量打印为单行,那么您将使用现在的代码。
作为旁注,您可以通过使用pandas来避免一些头痛(或者,可以说,引入更多的头痛) 。如果你这样做,你可以做类似下面的事情。唯一的问题是您不能将列命名为相同的东西,因此您必须将第一列和第二列命名为V
and VS
,而不是V
and 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
已经做了大量的工作来使打印效果很好。我们越能利用这项工作,我们就越有信心我们的输出将是强大的并且看起来真的很好。但是,您也可以决定忽略此答案的后半部分,我真的不会反对您。
推荐阅读
- python - docker-compose 在附加后挂起
- c++ - inFile - 读取不同的文件
- node.js - 我无法直接访问 Angular 中的 url
- php - 致命错误:未捕获的 PDOException:列不能为空(但它不为空......)
- javascript - 在子页面中按钮功能不起作用
- python - 我想解方程:x**2*y**2 + x**2 -10*x*y + 4*y**2 + 9.0=0,有没有办法得到真正的解决方案?
- python - 使用 Tensorflow 和 Keras 进行迁移学习的问题
- c++ - 可变参数函数不会用 clang 编译
- excel - 如果第一张工作表不返回匹配项,则从下一张工作表返回结果的公式
- postgresql - 定义唯一约束时列顺序是否重要