2015-06-22 17 views
6

Tôi có nhiều tập dữ liệu HDF5 được lưu trong cùng một tệp, my_file.h5. Những bộ dữ liệu có kích thước khác nhau, nhưng cùng một số quan sát trong chiều đầu tiên:Xáo trộn nhiều tập dữ liệu HDF5 tại chỗ

features.shape = (1000000, 24, 7, 1) 
labels.shape = (1000000) 
info.shape = (1000000, 4) 

Điều quan trọng là các dữ liệu thông tin/nhãn được kết nối một cách chính xác đến từng bộ các tính năng và do đó tôi muốn xáo trộn các bộ dữ liệu với giống hệt nhau. Hơn nữa, tôi muốn trộn những thứ này mà không bao giờ tải chúng hoàn toàn vào bộ nhớ. Có thể sử dụng numpy và h5py?

Trả lời

1

Việc xáo trộn mảng trên đĩa sẽ tốn thời gian, vì nó có nghĩa là bạn đã cấp phát mảng mới trong tệp hdf5, sau đó sao chép tất cả các hàng theo thứ tự khác. Bạn có thể lặp qua các hàng (hoặc sử dụng các đoạn của các hàng), nếu bạn muốn tránh tải tất cả dữ liệu cùng một lúc vào bộ nhớ với PyTables hoặc h5py.

Một cách tiếp cận khác có thể là giữ dữ liệu của bạn và chỉ đơn giản là ánh xạ số hàng mới cho số hàng cũ trong một mảng riêng biệt (bạn có thể nạp đầy RAM) vì nó sẽ chỉ có 4MB với mảng của bạn kích thước). Ví dụ, để shuffle một mảng NumPy x,

x = np.random.rand(5) 
idx_map = numpy.arange(x.shape[0]) 
numpy.random.shuffle(idx_map) 

Sau đó, bạn có thể sử dụng advanced numpy indexing để truy cập dữ liệu xáo trộn của bạn,

x[idx_map[2]] # equivalent to x_shuffled[2] 
x[idx_map] # equivament to x_shuffled[:], etc. 

này sẽ làm việc cũng với mảng lưu vào hdf5. Tất nhiên sẽ có một số chi phí, so với việc viết các mảng xáo trộn trên đĩa, nhưng nó có thể là đủ tùy thuộc vào trường hợp sử dụng của bạn.

+1

Ai đó vừa mới bỏ phiếu cho 2 câu trả lời này. Tôi tự hỏi tại sao? Có phải ai đó thất vọng vì chúng tôi đã nói không thể làm được? Hay ai đó có một giải pháp? Bình luận thường là nhiều thông tin hơn mà downvotes. – hpaulj

+0

Có lẽ vì câu hỏi được chỉ định "không bao giờ tải chúng hoàn toàn vào bộ nhớ". Trong cả hai câu trả lời X phải được nạp vào bộ nhớ. – wassname

1

mảng Xáo trộn như thế này trong numpy là thẳng về phía trước

Tạo chỉ số suffling lớn (xáo trộn np.arange(1000000)) và chỉ số các mảng

features = features[I, ...] 
labels = labels[I] 
info = info[I, :] 

Đây không phải là một hoạt động inplace. labels[I] là bản sao của labels, không phải là một lát hoặc chế độ xem.

Một thay thế

features[I,...] = features 

trông trên bề mặt như nó là một hoạt động inplace. Tôi nghi ngờ rằng nó là, xuống trong mã C. Nó phải được đệm, bởi vì các giá trị I không được đảm bảo là duy nhất. Trong thực tế, có một phương pháp đặc biệt ufunc.at cho các hoạt động không được thực hiện.

Nhưng nhìn vào những gì h5py nói về cùng một loại này 'chỉ mục ưa thích':

http://docs.h5py.org/en/latest/high/dataset.html#fancy-indexing

labels[I] lựa chọn được thực hiện, nhưng với những hạn chế.

List selections may not be empty 
Selection coordinates must be given in increasing order 
Duplicate selections are ignored 
Very long lists (> 1000 elements) may produce poor performance 

Xáo trộn I, theo định nghĩa không theo thứ tự tăng dần. Và nó rất lớn.

Ngoài ra, tôi không thấy bất kỳ điều gì về việc sử dụng chỉ mục ưa thích này ở bên trái, labels[I] = ....

Các vấn đề liên quan