Из документов h5py я вижу, что могу транслировать набор данных HDF в качестве другого типа с использованием метода astype
для наборов данных. Это возвращает диспетчер контекста, который выполняет преобразование на лету.
Однако я хотел бы прочитать набор данных, хранящийся как uint16
, а затем преобразовать его в тип float32
. После этого я хотел бы извлечь различные срезы из этого набора данных в другой функции в качестве типа приведения float32
. Документы объясняют использование как
with dataset.astype('float32'):
castdata = dataset[:]
Это приведет к тому, что весь набор данных будет прочитан и преобразован в float32
, чего я не хочу. Я хотел бы иметь ссылку на набор данных, но float32
эквивалентен numpy.astype
. Как мне создать ссылку на объект .astype('float32')
, чтобы я мог передать его другой функции для использования?
Пример:
import h5py as HDF
import numpy as np
intdata = (100*np.random.random(10)).astype('uint16')
# create the HDF dataset
def get_dataset_as_float():
hf = HDF.File('data.h5', 'w')
d = hf.create_dataset('data', data=intdata)
print(d.dtype)
# uint16
with d.astype('float32'):
# This won't work since the context expires. Returns a uint16 dataset reference
return d
# this works but causes the entire dataset to be read & converted
# with d.astype('float32'):
# return d[:]
Кроме того, похоже, что контекст astype применяется только при доступе к элементам данных. Это означает, что
def use_data():
d = get_data_as_float()
# this is a uint16 dataset
# try to use it as a float32
with d.astype('float32'):
print(np.max(d)) # --> output is uint16
print(np.max(d[:])) # --> output is float32, but entire data is loaded
Итак, нет ли способа использования astype в стиле numpy?
np.max(d)
делает здесь что-то особенно умное. Посколькуd
не имеет собственного метода.max()
,np.max()
прочитает массив в память и вызовет для негоnp.core.umath.maximum.reduce()
, используяd.dtype
для установки типа вывода. Тайминги дляnp.max(d)
иnp.max(d[:])
почти идентичны. - person ali_m   schedule 11.08.2014