Python 附加到数组开头的nil值

Python 附加到数组开头的nil值,python,arrays,pandas,numpy,Python,Arrays,Pandas,Numpy,我有一个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(supp

我有一个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


提前感谢。

np.empty((1,4))
创建给定形状的新数组。这意味着fullstack数组不是空的,甚至在您开始在循环中向其追加
nameandDeg
之前就包含值。将
fullstack
写入
foo3.txt
文件时,您看到的第一行是这些值。

np.empty((1,4))
创建给定形状的新数组。这意味着fullstack数组不是空的,甚至在您开始在循环中向其追加
nameandDeg
之前就包含值。当您将
fullstack
写入
foo3.txt
文件时,您看到的第一行是那些值。

之所以获得该行
0.0 5e-324 1e-323 1.5e-323
是因为该行
fullstack=np.empty((1,4))
。而在数值计算中,
np.empty(someshape)
会产生有效值为0的条目,并将其保存到文件中,或:
0.0 5e-324 1e-323 1.5e-323
。只需将
np.savetxt()
行更改为

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

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


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

获得行
0.0 5e-324 1e-323 1.5e-323
的原因是因为行
fullstack=np.empty((1,4))
。而在数值计算中,
np.empty(someshape)
会产生有效值为0的条目,并将其保存到文件中,或:
0.0 5e-324 1e-323 1.5e-323
。只需将
np.savetxt()
行更改为

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

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


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

在将其交给
savetxt
之前查看
fullstack
。注意
shape
dtype
。如果不尝试显示字母列,可以使用浮点
fmt
而不是通用
%s
。您也可以尝试使用
fmt='%10s%0.3f%0.3f%0.3f'
——但这仅在
dtype
是对象时有效,而不是字符串dtype.Hi,设置
fmt='%10s%0.3f%0.3f%0.3f
会导致以下错误
ValueError:fmt的%格式数错误:%10s%0.3f%0.3f%0.3f
中的%格式数应与数组中的列数匹配
np.savetxt
docs试图解释使用
fmt
参数所能做的一切。最终,它构造(或使用)了一个格式字符串,就像Python打印一样。例如
'%s%s….'%tuple(a_row)
。感谢您的支持,我尝试了您对该文件不同版本的建议。尝试在正确的实例上运行它,但我得到以下错误
TypeError:array-dtype之间不匹配(“在将其交给
savetxt
之前,请查看
fullstack
。请注意
shape
dtype
。如果您没有尝试显示字母列,可以使用float
fmt
而不是通用的
%s
。您也可以尝试
fmt='%10s%0.3f%0.3f%0.3f'
,尽管这样做会有帮助。)只有当
dtype
是对象时才有效,而不是字符串dtype。嗨,设置
fmt='%10s%0.3f%0.3f%0.3f
会导致以下错误
ValueError:fmt有错误的%format数目:%10s%0.3f%0.3f
fmt
中的%format数目应该与数组中的列数匹配。
np.savetxt
文档试图解释使用
fmt
参数所能做的一切。最终,它构造(或使用)一个格式字符串,就像Python打印一样。例如
'%s%s..'%tuple(一行)
。感谢您的支持,我尝试了您对该文件不同版本的建议。尝试在正确的实例上运行该文件,但出现以下错误
TypeError:数组数据类型之间不匹配('Hi Rohan,感谢您的洞察力。我以前使用过这种方法,但从未观察到这种现象。为了使程序防弹,您能推荐一种替代方法吗?使用np.array进行附加效率很低--相反,将fullstack更改为常规列表--
fullstack=[]
并使用列表附加操作进行附加。然后要获得最终结果,请执行
np.vstack(fullstack)
。您可以初始化
fullstack=np.empty((0,4))
,但列表附加方法比Hi Rohan更好,感谢他的洞察力。我以前使用过这种方法,但从未观察到这种现象。为了使程序防弹,您能推荐一种替代方法吗?使用np.array进行附加效率很低——相反,将fullstack更改为常规列表--
fullstack=[]
并使用列表追加操作进行追加。然后要获得最终结果,请执行