Невозможно изменить элемент в наборе данных большего размера - PullRequest
0 голосов
/ 22 февраля 2019

Мой набор данных состоит из многомерного массива матриц.Я пытаюсь изменить значение одной из матриц, но написанный мной код продолжает показывать старое значение даже после того, как я переназначил новое значение:

import h5py
import numpy as np

f1 = h5py.File('myfile.h5', 'r+')
print("Keys: %s" % f1.keys())
print("old value is :", f1["myArray"][0][0][0])
f1["myArray"][0][0][0] = 100
f1.close()

f2 = h5py.File('myfile.h5', 'r')
print("Keys: %s" % f2.keys())
print("new value is :", f2["myArray"][0][0][0])
f2.close()

1 Ответ

0 голосов
/ 22 февраля 2019

Проблема в том, как вы индексируете.Чтобы сделать то, что вы хотите, вы хотите написать в элемент [0,0,0] (а не [0][0][0]).Следующий код выполняет то, что вы хотели:

import h5py
import numpy as np

file = h5py.File('myfile.h5', 'w')

file["myArray"] = np.arange(5*5*5).reshape(5,5,5)
print("old value is :", file["myArray"][0,0,0])

file["myArray"][0,0,0] = 100
print("new value is :", file["myArray"][0,0,0])

file.close()

(также работает при закрытии / повторном открытии файла, который я для ясности пропустил).Этот код выводит:

old value is : 0
new value is : 100

Пожалуйста, рассмотрите документацию Numpy по индексированию , чтобы получить больше информации.


После прочтения документации вас должно удивить, что то, что вы сделали, не сработало.Потому что

A = np.arange(5*5*5).reshape(5,5,5)
A[0][0][0] = 100
print(A[0,0,0])

выводит 100.Это работает, потому что каждый раз, когда вы делаете [0], вы получаете указатель на подмассив (а не копию).Таким образом, изменение записей этого подмассива изменяет базовые данные (исходный массив).

Я предполагаю, что, поскольку h5py записывает на диск, получение [0] в первый раз возвращает копию (в то время как после этого возвращается указатель).Это подозрение подтверждается в этом примере:

import h5py
import numpy as np

file = h5py.File('myfile.h5', 'w')
file["myArray"] = np.arange(5*5*5).reshape(5,5,5)

data = file["myArray"][0]
data[0,0] = 100
print(data[0,0])
print(file["myArray"][0,0,0])

file.close()

, который выводит

100
0
...