numpy字符串文件行浮动数组科学记数法

问题描述 投票:0回答:2

我有csv文件,每行有4x4矩阵,每个文件有300多行。我想numpy.multiply每个4x4矩阵由[0,0,0,1]我尝试转换为numpy.array,numpy.matrix等,并尝试更改原始表示法无济于事。我想要处理的行的格式:

camera1="[['9.5820988666217111e-001','1.8364288924172481e-002','2.8547603401192861e-001','-1.0076250938522580e+001'],['-1.7086800960614995e-001','-7.6361969781499617e-001','6.2264683441110236e-001','-4.5906868751556480e+001'],['2.2942958919045936e-001','-6.4540507435349748e-001','-7.2857007460000278e-001','2.1664174288937179e+001'],['0.0000000000000000e+000','0.0000000000000000e+000','0.0000000000000000e+000','1.0000000000000000e+000']]"

关于numpy和我应该使用的矩阵和数组之间的区别,我有点困惑。我希望每一行都能实现的是产品

9.58209887e-01  1.83642889e-02  2.85476034e-01  -1.00762509e+01
-1.70868010e-01 -7.63619698e-01 6.22646834e-01  -4.59068688e+01
2.29429589e-01  -6.45405074e-01 -7.28570075e-01 2.16641743e+01
0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00

乘以

0,0,0,1, 

获得

[[0.0,0.0,0.0,-10.07625094],
[ -0.0,-0.0,0.0,-45.90686875],
[0.0,-0.0,-0.0,21.66417429],
[0.0,0.0,0.0,1.0]]

但我只得到像Not Implemented这样的错误。任何线索?

这将是我的python脚本:

import numpy as nm

def getCoord(fila):
#lee la línea y extrae las coordenadas XYZ
    vect=fila.split('=')
    print (vect)
    camID=vect[0]
    trMatrix=vect[1]
    b=[0,0,0,1]
    crs=nm.multiply(trMatrix,b)[0:3]
    return camid,crs

unFichero=r"docmatrix.txt"
with open('outfile.csv', 'w') as f:
    f.write(r"camera,coorx,coory,coorz")
    with open(unFichero) as infile:
        transf=getCoord(infile.read())
        f.write(transf[0]+","+transf[1]+'\n')
string file numpy matrix-multiplication scientific-notation
2个回答
0
投票

我试图将字符串转换为列表,然后转换为数组,这似乎可以解决问题:

import numpy as np
import ast
string="[['9.5820988666217111e-001','1.8364288924172481e-002','2.8547603401192861e-001','-1.0076250938522580e+001'],['-1.7086800960614995e-001','-7.6361969781499617e-001','6.2264683441110236e-001','-4.5906868751556480e+001'],['2.2942958919045936e-001','-6.4540507435349748e-001','-7.2857007460000278e-001','2.1664174288937179e+001'],['0.0000000000000000e+000','0.0000000000000000e+000','0.0000000000000000e+000','1.0000000000000000e+000']]"
c=ast.literal_eval(string) 

然后

cc=np.array(c).astype(float)

这样我现在有一系列花车现在我可以定义

d=[0,0,0,1]
prod=np.multiply(cc,d)

获得

>>> prod
array([[  0.        ,   0.        ,   0.        , -10.07625094],
       [ -0.        ,  -0.        ,   0.        , -45.90686875],
       [  0.        ,  -0.        ,  -0.        ,  21.66417429],
       [  0.        ,   0.        ,   0.        ,   1.        ]])

我想要的是从这个4x4矩阵中获取XYZ坐标

coor=[prod[0,3],prod[1,3],prod[2,3]]

我现在有

>>> coor
[-10.07625093852258, -45.90686875155648, 21.664174288937179]

所以,无论如何,只是为了记录,我发布这个解决方案。也许有人可以告诉我一个更好的方法。还是非常感谢。


0
投票

这是最后的脚本:

# -*- coding: utf-8 -*-
import numpy as np
import ast

def getCoord(fila):
#lee la línea y extrae las coordenadas XYZ
    vect=fila.split('=')
    camID=vect[0]
    print vect[1]
    trList=ast.literal_eval(vect[1])
    trArray=np.array(trList).astype(float)
    print trArray
    b=[0,0,0,1]
    prod=np.multiply(trArray,b)
    coor=[prod[0,3],prod[1,3],prod[2,3]]
    return camID,prod[0,3],prod[1,3],prod[2,3]

unFichero=r"c:\temp\docmatrix.txt"
with open('outfile.csv', 'w') as f:
    f.write("camera,coorx,coory,coorz\n")
    with open(unFichero) as infile:
        for row in infile.readlines():
            transf=getCoord(row)
            print transf
            f.write(','.join(str(e) for e in transf)+'\n')
© www.soinside.com 2019 - 2024. All rights reserved.