Đầu vào và đầu ra mảng numpy sang h5py


100

Tôi có một mã Python có đầu ra là một nhập mô tả hình ảnh ở đâyma trận có kích thước, có các mục nhập đều thuộc loại float. Nếu tôi lưu nó với phần mở rộng .dat, kích thước tệp là 500 MB. Tôi đọc rằng việc sử dụng h5pylàm giảm kích thước tệp đáng kể. Vì vậy, giả sử tôi có tên mảng 2D numpy A. Làm cách nào để lưu nó vào tệp h5py? Ngoài ra, làm cách nào để đọc cùng một tệp và đặt nó dưới dạng một mảng numpy trong một mã khác, vì tôi cần thực hiện các thao tác với mảng?


4
Làm thế nào bạn lưu nó với .dattiện ích mở rộng?
jorgeca

@jorgeca: vì điều đó tôi chỉ làmnp.savetxt("output.dat",A,'%10.8e')
lovepeed

3
Cảm ơn (riêng phần mở rộng không có nhiều ý nghĩa, nó có thể được lưu trữ dưới dạng nhị phân, ascii ...). Trừ khi bạn cần các tính năng bổ sung của hdf5, tôi chỉ sử dụng np.save('output.dat', A)nó sẽ lưu nó ở định dạng nhị phân (nhanh hơn nhiều, sử dụng ít dung lượng hơn nhiều).
jorgeca

@jorgeca nhưng một kịch bản python sẽ có thể đọc nó như là một mảng 2D khi tôi gọi nó làA = np.loadtxt('output.dat',unpack=True)
lovespeed

2
vì vậy h5pykhông tạo các tệp nhỏ hơn những gì np.savesẽ? là h5pynhanh hơn np.savecho mảng kích thước được đưa ra trong câu hỏi?
dbliss

Câu trả lời:


131

h5py cung cấp một mô hình tập dữ liệunhóm . Cái trước về cơ bản là các mảng và cái sau bạn có thể coi là thư mục. Mỗi cái được đặt tên. Bạn nên xem tài liệu về API và các ví dụ:

http://docs.h5py.org/en/latest/quick.html

Một ví dụ đơn giản trong đó bạn đang tạo tất cả dữ liệu từ trước và chỉ muốn lưu nó vào tệp hdf5 sẽ trông giống như sau:

In [1]: import numpy as np
In [2]: import h5py
In [3]: a = np.random.random(size=(100,20))
In [4]: h5f = h5py.File('data.h5', 'w')
In [5]: h5f.create_dataset('dataset_1', data=a)
Out[5]: <HDF5 dataset "dataset_1": shape (100, 20), type "<f8">

In [6]: h5f.close()

Sau đó, bạn có thể tải lại dữ liệu đó bằng cách sử dụng: '

In [10]: h5f = h5py.File('data.h5','r')
In [11]: b = h5f['dataset_1'][:]
In [12]: h5f.close()

In [13]: np.allclose(a,b)
Out[13]: True

Chắc chắn hãy kiểm tra các tài liệu:

http://docs.h5py.org

Việc ghi vào tệp hdf5 phụ thuộc vào h5py hoặc pytables (mỗi loại có một API python khác nhau nằm trên đầu thông số kỹ thuật tệp hdf5). Bạn cũng nên xem xét các định dạng nhị phân đơn giản khác do numpy cung cấp, chẳng hạn như np.save, np.savezv.v.:

http://docs.scipy.org/doc/numpy/reference/routines.io.html


Btw. nếu bạn không biết trước tên của tập dữ liệu trong khi đọc, bạn phải phân tích cú pháp tệp hdf tương tự như ở đây .
Trilarion

@JoshAdel nếu tôi muốn thêm một cột vào tập dữ liệu. tập dữ liệu của tôi là một np.array đa chiều được lập chỉ mục là [img_id, hàng, cột, kênh]. và tôi đã lưu nó bằng phương pháp được mô tả trong câu trả lời của bạn. Tôi truy cập tất cả các điểm trong tập dữ liệu bằng h5f ['dataset_1'] [img_id]. những gì tôi muốn là một cách để thêm một cột khác, nói là 'mycolumn' ... tương ứng với mọi img_id trong tập dữ liệu. làm cách nào để thêm một cột khác vào cột này để tôi có thể thực hiện h5f ['mycolumn'] [img_id]?
iratzhash

Nếu tôi viết ma trận như thế này, thì tôi không thể nhìn thấy chúng với HDFView 2.11 - Tôi có thể mở tệp, tôi có thể thấy rằng tập dữ liệu data.h5tồn tại, nhưng tôi không thể xem nó bằng HDFView. Tôi có thể đọc nội dung với h5py, nhưng không thể kiểm tra nó bằng HDFView. Bất kỳ ý tưởng tại sao?
Martin Thoma

104

Một cách tốt hơn để xử lý việc mở / đóng tệp và tránh rò rỉ bộ nhớ:

Chuẩn bị:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such

Viết:

with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)

Đọc:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]

2
Không cần đóng tệp?
ricoamor

22
@DrDeSancho không, tuyên bố với
Leonid

1
đặc biệt hữu ích khi chạy trong chế độ tương tác (bởi vì nếu không một rủi ro để có được một ngoại lệ từ h5py về một tập tin đã được mở khi một chiếu lại cùng mã mà không đúng cách đóng cửa trong nỗ lực đầu tiên)
Andre Holzner

Các withtính năng của Python được gọi là quản lý bối cảnh. Nó sẽ đảm bảo rằng tệp được đóng sau khi nó đã được sử dụng. Thông tin thêm có sẵn trong tài liệu chính thức: docs.python.org/3/library/contextlib.html
Đánh dấu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.