簡體   English   中英

在二進制文件上使用numpy fromfile返回1維ndarray

[英]Using numpy fromfile on binary file returns 1 dimension ndarray

我正在使用numpy的fromfile函數從二進制文件中讀取數據。 該文件包含一系列值(3 * float32,3 * int8,3 * float32),我想將其提取為具有(rows,9)形狀的numpy ndarray。

with open('file/path', 'rb') as my_file:
    my_dtype = np.dtype('>f4, >f4, >f4, >i1, >i1, >i1, >f4, >f4, >f4' )
    my_array = np.fromfile( my_file, dtype = my_dtype )

    print(my_array.shape)
    print(type(my_array[0]))
    print(my_array[0])

這會返回:

(38475732,)
<type 'numpy.void'>
(-775.0602416992188, -71.0, -242.5240020751953, 39, 39, 39, 5.0, 2753.0, 15328.0)
  1. 如何獲得具有形狀的二維ndarray(38475732,9)?

  2. 為什么返回的元組是'numpy.void'類型?

重新定義問題:

如果我想從文件中讀取的所有值,例如,4字節浮點數,我將使用np.dtype('9> f4'),我會得到我需要的。 但是,由於我的二進制文件包含不同的類型,有沒有辦法將所有值轉換為32位浮點數?

PS:我可以使用'struct'將二進制文件解析為一個列表,然后將此列表轉換為ndarray,但這種方法比使用np.fromfile慢得多

解:

感謝Hpaulj的回答! 我在代碼中所做的是添加以下行來執行從numpy fromfile函數返回到預期的ndarray的recarray的轉換:

my_array = my_array.astype('f4, f4, f4, f4, f4, f4, f4, f4, f4').view(dtype='f4').reshape(my_array.shape[0], 9)

返回一個(38475732,9)ndarray

干杯!

什么是my_array[[0]] my_arraymy_dtype定義的1d記錄數組。

my_array[0]是其中一個記錄,一個元組。 請注意,有些條目是浮點數,有些是整數。 如果它是一個2d數組的行,則所有條目都是相同的類型(例如float)。

要將其轉換為2d浮點數組,您可以嘗試:

np.array(my_array.tolist())

另一種方法是將所有字段轉換為相同的類型,並重新整形。 沿着這條線的東西(在不同的重新排列上測試):

x = array([(1.0, 2), (3.0, 4)], dtype=[('x', '<f8'), ('y', '<i4')])
x.astype([('x', '<f8'), ('y', '<f8')]).view(dtype='f8').reshape(2,2)

另請參見: 如何將numpy.recarray轉換為numpy.array?

由於您需要數組包含不同的數據類型,因此您將獲得一個結構化數組 ,其中每個元素都是一個記錄。 您可以使用訪問字段

>>> my_array.dtype.names
('f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8')
>>> my_array[0]['f1']
-71.0
>>> my_array['f1']
array([-71.], dtype=float32)

基本的ndarray包含相同類型的元素,如果你需要一個帶形狀的ndarray(38475732,9,),你必須將你的數組轉換成浮點數。 見上面的鏈接。

不能確切地說為什么(沒有使用結構化數組),但是numpy.void原因是你的自定義類型(數組已知)不會被廣播到記錄中。 但是什么類型的子記錄?

>>> arr[['f0','f1']][0]
(-775.0602416992188, -71.0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM