Python如何用NumPy讀取和保存點(diǎn)云數(shù)據(jù)_第1頁(yè)
Python如何用NumPy讀取和保存點(diǎn)云數(shù)據(jù)_第2頁(yè)
Python如何用NumPy讀取和保存點(diǎn)云數(shù)據(jù)_第3頁(yè)
Python如何用NumPy讀取和保存點(diǎn)云數(shù)據(jù)_第4頁(yè)
Python如何用NumPy讀取和保存點(diǎn)云數(shù)據(jù)_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Python如何用NumPy讀取和保存點(diǎn)云數(shù)據(jù)目錄前言loadtxt函數(shù)的用法基本用法指定每一列的數(shù)據(jù)類型結(jié)合生成器使用tofile和fromfile函數(shù)

前言

最近在學(xué)習(xí)點(diǎn)云處理的時(shí)候用到了Modelnet40數(shù)據(jù)集,該數(shù)據(jù)集總共有40個(gè)類別,每個(gè)樣本的點(diǎn)云數(shù)據(jù)存放在一個(gè)TXT文件中,每行的前3個(gè)數(shù)據(jù)代表一個(gè)點(diǎn)的xyz坐標(biāo)。我需要把TXT文件中的每個(gè)點(diǎn)讀取出來(lái),然后用Open3D進(jìn)行顯示。怎么把數(shù)據(jù)從TXT文件中讀取出來(lái)呢?NumPy提供了一個(gè)功能非常強(qiáng)大的函數(shù)loadtxt可以非常簡(jiǎn)單地實(shí)現(xiàn)這個(gè)功能。來(lái)看一下代碼:

import

open3d

as

o3d

import

numpy

as

np

def

main():

points_data

=

np.loadtxt("airplane_0001.txt",

delimiter=",",

dtype=np.float32)

pcd

=

o3d.geometry.PointCloud()

pcd.points

=

o3d.utility.Vector3dVector(points_data[:,

:3])

o3d.visualization.draw_geometries([pcd])

if

__name__

==

'__main__':

main()

從上面的代碼可以看到,只需要一行代碼就可以把TXT文件中的點(diǎn)云數(shù)據(jù)讀取進(jìn)來(lái)了,接下來(lái)就可以調(diào)用Open3D的接口進(jìn)行顯示了。在介紹loadtxt函數(shù)的用法之前,

順便看一下Open3D的顯示效果:

loadtxt函數(shù)的用法

基本用法

在上面的例子中,由于TXT里面每一行的數(shù)據(jù)是用逗號(hào)分割的,所以在調(diào)用loadtxt函數(shù)的時(shí)候除了設(shè)置文件路徑外,還需要設(shè)置參數(shù)delimiter=,。另外,該函數(shù)默認(rèn)的數(shù)據(jù)類型為float64,如果是其他數(shù)據(jù)類型的話還需要設(shè)置dtype為對(duì)應(yīng)類型。

points_data

=

np.loadtxt("airplane_0001.txt",

delimiter=",")

#沒(méi)有指定數(shù)據(jù)類型

print('shape:

',

points_data.shape)

print('data

type:

',

points_data.dtype)

結(jié)果:

shape:(10000,6)

datatype:float64

指定每一列的數(shù)據(jù)類型

假如我們有一個(gè)CSV文件:

x,y,z,label,id

-0.098790,-0.182300,0.163800,1,1

0.994600,0.074420,0.010250,0.2,2

0.189900,-0.292200,-0.926300,3,3

-0.989200,0.074610,-0.012350,4,4

該文件前面3列的數(shù)據(jù)類型是浮點(diǎn)型,后面2列的數(shù)據(jù)類型為整型,那么按照前面的方式設(shè)置dtype來(lái)讀取就不合適了。不過(guò)沒(méi)關(guān)系,loadtxt函數(shù)可以設(shè)置每一列數(shù)據(jù)的數(shù)據(jù)類型,只不過(guò)稍微復(fù)雜一點(diǎn),來(lái)看一下代碼:

data

=

np.loadtxt("test.txt",

delimiter=",",

dtype={'names':

('x',

'y',

'z',

'label',

'id'),

'formats':

('f4',

'f4',

'f4',

'i4',

'i4')},

skiprows=1)

print('data:

',

data)

print('data

type:

',

data.dtype)

這段代碼的重點(diǎn)是dtype={}里面的內(nèi)容,names用來(lái)設(shè)置每一列數(shù)據(jù)的名稱,formats則用來(lái)設(shè)置每一列數(shù)據(jù)的數(shù)據(jù)類型,其中f4表示float32,i4表示int32。另外,CSV文件中的第一行不是數(shù)據(jù)內(nèi)容,可以設(shè)置參數(shù)skiprows=1跳過(guò)第一行的內(nèi)容。

輸出結(jié)果:

data:[(-0.09879,-0.1823,0.1638,1,1)(0.9946,0.07442,0.01025,0,2)

(0.1899,-0.2922,-0.9263,3,3)(-0.9892,0.07461,-0.01235,4,4)]

datatype:[(x,f4),(y,f4),(z,f4),(label,i4),(id,i4)]

可以看到,通過(guò)這樣的方式設(shè)置dtype,讀取的每一行數(shù)據(jù)變成了一個(gè)tuple類型。

結(jié)合生成器使用

從NumPy的文檔中可以知道,loadtxt函數(shù)的第一個(gè)參數(shù)可以是文件對(duì)象、文件名或者生成器。傳入生成器有什么用呢?我們來(lái)看幾個(gè)例子。

處理多個(gè)分隔符

假如我們的文件內(nèi)容是這樣的,每一行數(shù)據(jù)有3個(gè)分隔符,,/和-:

9.87,1.82,1.63,1/11-1

9.94,7.44,1.02,1/11-2

1.89,2.92,9.26,1/11-3

0.98,7.46,1.23,1/11-4

這種情況下不能通過(guò)delimiter參數(shù)設(shè)置多個(gè)分隔符,這時(shí)候就可以通過(guò)生成器來(lái)進(jìn)行處理:

def

generate_lines(file_path,

delimiters=[]):

with

open("test.txt")

as

f:

for

line

in

f:

line

=

line.strip()

for

d

in

delimiters:

line

=

line.replace(d,

"

")

yield

line

delimiters

=

[",",

"/",

"-"]

generator

=

generate_lines("test.txt",

delimiters)

data

=

np.loadtxt(generator)

print(data)

這段代碼構(gòu)建了一個(gè)生成器將文件中每一行的分隔符全部替換成loadtxt函數(shù)默認(rèn)的空格分隔符,然后把生成器傳入loadtxt函數(shù),這樣loadtxt函數(shù)就能成功解析文件中的數(shù)據(jù)了。

輸出結(jié)果:

[[9.871.821.631.11.1.]

[9.947.441.021.11.2.]

[1.892.929.261.11.3.]

[0.987.461.231.11.4.]]

讀取指定的行

在某些情況下,我們需要讀取指定幾行的數(shù)據(jù),那么也可以通過(guò)生成器來(lái)實(shí)現(xiàn)。還是上面的文件內(nèi)容,我們通過(guò)生成器來(lái)讀取第2行和第3行:

def

generate_lines(file_path,

delimiters=[],

rows=[]):

with

open("test.txt")

as

f:

for

i,

line

in

enumerate(f):

line

=

line.strip()

for

d

in

delimiters:

line

=

line.replace(d,

"

")

if

i

in

rows:

yield

line

delimiters

=

[",",

"/",

"-"]

rows

=

[1,

2]

generator

=

generate_lines("test.txt",

delimiters,

rows)

data

=

np.loadtxt(generator)

print(data)

輸出結(jié)果:

[[9.947.441.021.11.2.]

[1.892.929.261.11.3.]]

通過(guò)上面的例子可以知道,loadtxt函數(shù)結(jié)合生成器使用可以實(shí)現(xiàn)很多的功能。

tofile和fromfile函數(shù)

從TXT文件中讀取到點(diǎn)云數(shù)據(jù)后,我想把數(shù)據(jù)保存到二進(jìn)制文件中,需要怎么操作呢?NumPy的ndarray類提供了tofile函數(shù)可以非常方便地將數(shù)據(jù)保存到二進(jìn)制文件中。把數(shù)據(jù)以二進(jìn)制文件保存后又怎么讀進(jìn)來(lái)呢?NumPy還提供了一個(gè)fromfile函數(shù)用于從文本文件和二進(jìn)制文件中讀取數(shù)據(jù)。

import

open3d

as

o3d

import

numpy

as

np

def

main():

points_data

=

np.loadtxt(

"airplane_0001.txt",

delimiter=",",

dtype=np.float32)

bin_file

=

'airplane_0001.bin'

points_data

=

points_data[:,

:3]

points_data.tofile(bin_file)

pc

=

np.fromfile(bin_file,

dtype=np.float32)

pc

=

pc.reshape(-1,

3)

pcd

=

o3d.geometry.PointCloud()

pcd.points

=

o3d.utility.Vector3dVector(pc)

o3d.visualiza

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論