【问题标题】:nil values appended to beginnning of arraynil 值附加到数组的开头
【发布时间】:2020-08-26 00:15:51
【问题描述】:

我有一个文件 foo.txt,其中包含以下几行:

A 10 20 30
B 40 50 60
C 70 80 90

我将这些值转换为弧度并将它们转换为旋转矩阵,然后将旋转矩阵与另一个旋转矩阵相乘,并将输出存储在新变量中,然后再保存到新的文本文件中。

import transforms3d.euler as t3d
import numpy as np
import pandas as pd


# Suppress scientific notation
np.set_printoptions(suppress=True)

file="foo.txt"

r1=np.array([[1,0,0],[0,1,0],[0,0,1]])
r2=np.array([[0.5,-0.30902,-0.80902],[0.30902,-0.80902,0.5],[-0.80902,-0.5,-0.30902]])
r3=np.array([[0.5,0.30902,-0.80902],[-0.30902,-0.80902,-0.5],[-0.80902,0.5,-0.30902]])
R=np.array([r1,r2,r3])

source_array=pd.read_csv(file, sep=" ", header=None)

name_array=source_array.iloc[:,0].to_numpy()
number_array=source_array.iloc[:,1:4].to_numpy()


fullstack=np.empty((1,4))
for i in range(number_array.shape[0]):
    inMat=t3d.euler2mat(np.radians(number_array[i][0]),\
                         np.radians(number_array[i][1]),\
                         np.radians(number_array[i][2]),'rzyz')
    for j in range(R.shape[0]):
        expMat=np.dot(inMat,R[j])
        expDeg=np.degrees(t3d.mat2euler(expMat))
        name=np.repeat(name_array[i],1)
        nameandDeg=np.hstack((name,expDeg)).reshape(1,4)
        fullstack=np.append(fullstack,nameandDeg,axis=0)
        np.savetxt('foo3.txt',fullstack,fmt='%s')

预期的输出是

A 10.314104815618196 17.229396562958897 41.56670396614096
A -86.15202640927517 58.81289030540899 101.65925914885956
A 119.58912709295329 73.9812604867084 6.339258927995449
B 45.90468727333836 22.521012118111006 109.63942512488691
B -59.08770198050942 30.43292092265276 177.0466653835958
B -123.45325226252277 66.42599043668275 175.86346970407573
C 80.0 3.455054858914999e-15 160.0
C -63.59253616776351 -9.42984810562947 -140.45406233407002
C -127.56777089055139 26.411096630846163 -143.9360404337779

但是在以当前形式运行代码后,数组的开头会出现一个额外的行

**0.0** **5e-324** **1e-323** **1.5e-323**
A 10.314104815618196 17.229396562958897 41.56670396614096
A -86.15202640927517 58.81289030540899 101.65925914885956
A 119.58912709295329 73.9812604867084 6.339258927995449
B 45.90468727333836 22.521012118111006 109.63942512488691
B -59.08770198050942 30.43292092265276 177.0466653835958
B -123.45325226252277 66.42599043668275 175.86346970407573
C 80.0 3.455054858914999e-15 160.0
C -63.59253616776351 -9.42984810562947 -140.45406233407002
C -127.56777089055139 26.411096630846163 -143.9360404337779

为什么会出现这条线,我该如何摆脱它?

额外的问题,有没有办法格式化输出,以便所有包含浮点数的列都表示为 %0.3f?

提前致谢。

【问题讨论】:

  • 查看fullstack,然后将其提供给savetxt。注意shapedtype。如果您没有尝试显示字母列,您可以使用浮点数fmt 而不是通用的%s。您也可以尝试fmt='%10s %0.3f %0.3f %0.3f' - 虽然这仅在dtype 是对象而不是字符串dtype 时才有效。
  • 嗨,设置 fmt='%10s %0.3f %0.3f %0.3f 会导致以下错误 ValueError: fmt has wrong number of % formats: %10s%0.3f%0.3f%0.3f
  • fmt 中的 % 格式数应与数组中的列数相匹配。 np.savetxt 文档试图解释您可以使用 fmt 参数做的所有事情。最终它构造(或使用)一个格式字符串,就像 Python 打印一样,例如 '%s %s ....' % tuple(a_row).
  • 感谢您对我的包容,我正在尝试您对文件的不同版本的建议。尝试在正确的实例上运行它,但我收到以下错误 TypeError: Mismatch between array dtype ('<U20') and format specifier ('%10s %0.3f %0.3f %0.3f )

标签: python arrays pandas numpy


【解决方案1】:

您收到0.0 5e-324 1e-323 1.5e-323 行的原因是fullstack=np.empty((1,4)) 行。在数值计算中np.empty(someshape) 导致条目实际上等于 0,将它们保存到文件 still writes the in memory numerical value 或:0.0 5e-324 1e-323 1.5e-323。您可以通过简单地将np.savetxt() 行更改为

来阻止此行

np.savetxt('foo3.txt',fullstack[1:],fmt='%s')

或者通过重新思考为什么需要首先创建一个空数组。

还请注意,如果您在 j 循环的每次迭代中都附加到 fullstack。您不需要在 j 循环的每次迭代中保存完整堆栈,只需在 j 循环完成后保存一次。

【讨论】:

    【解决方案2】:

    np.empty((1,4)) 创建一个给定形状without initializing entries 的新数组。这意味着即使在循环中开始将nameandDeg 附加到它之前,fullstack 数组也不是空的并且包含值。当您将fullstack 写入foo3.txt 文件时,您看到的第一行就是这些值。

    【讨论】:

    • 您好 Rohan,感谢您的洞察力。我以前使用过这种方法,从未观察到这种现象。为了使程序防弹,您能推荐一种替代方法吗?
    • 使用 np.arrays 追加效率很低——相反,将 fullstack 更改为常规列表——fullstack = [] 并使用列表追加操作追加。然后要获得最终结果,请执行np.vstack(fullstack)
    • 你可以初始化fullstack=np.empty((0,4)),但是列表追加的方法更好
    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 2013-10-20
    • 2017-12-15
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2017-04-29
    • 2020-04-01
    相关资源
    最近更新 更多