gpt4 book ai didi

python - 将 numpy 数组写入 lmdb

转载 作者:太空宇宙 更新时间:2023-11-04 05:06:40 25 4
gpt4 key购买 nike

我正在尝试用 python 将一些 numpy 数组写入 lmdb:

import numpy as np
import lmdb

def write_lmdb(filename):
lmdb_env = lmdb.open(filename, map_size=int(1e9))
lmdb_txn = lmdb_env.begin(write=True)

X= np.array([[1.0, 0.0], [0.1, 2.0]])
y= np.array([1.4, 2.1])

#Put first pair of arrays
lmdb_txn.put('X', X)
lmdb_txn.put('y', y)

#Put second pair of arrays
lmdb_txn.put('X', X+1.6)
lmdb_txn.put('y', y+1.2)

def read_lmdb(filename):
lmdb_env = lmdb.open(filename)
lmdb_txn = lmdb_env.begin()
lmdb_cursor = lmdb_txn.cursor()
for key, value in lmdb_cursor:
print type(key)
print type(value)

print key
print value

write_lmdb('temp.db')
read_lmdb('temp.db')

但是 read_lmdb 什么都不打印,将 numpy 数组写入 lmdb 的正确方法是什么?

更新:基于@frankyjuang 的回答,我设法做到了,但不是以非常优雅的方式:多维数组失去了它的形状,每个数组都应该有自己的名字。

import numpy as np
import lmdb

def write_lmdb(filename):
print 'Write lmdb'

lmdb_env = lmdb.open(filename, map_size=int(1e9))

n_samples= 2
X= (255*np.random.rand(n_samples,3,4,3)).astype(np.uint8)
y= np.random.rand(n_samples).astype(np.float32)

for i in range(n_samples):
with lmdb_env.begin(write=True) as lmdb_txn:
lmdb_txn.put('X_'+str(i), X)
lmdb_txn.put('y_'+str(i), y)

print 'X:',X
print 'y:',y

def read_lmdb(filename):
print 'Read lmdb'

lmdb_env = lmdb.open(filename)
lmdb_txn = lmdb_env.begin()
lmdb_cursor = lmdb_txn.cursor()

n_samples=0
with lmdb_env.begin() as lmdb_txn:
with lmdb_txn.cursor() as lmdb_cursor:
for key, value in lmdb_cursor:
print key
if('X' in key):
print np.fromstring(value, dtype=np.uint8)
if('y' in key):
print np.fromstring(value, dtype=np.float32)

n_samples=n_samples+1

print 'n_samples',n_samples

write_lmdb('temp.db')
read_lmdb('temp.db')

测试脚本输出应该是这样的:

Write lmdb
X: [[[[ 48 224 119]
[ 76 87 174]
[ 14 88 183]
[ 76 234 56]]

[[234 223 65]
[ 63 85 175]
[184 252 125]
[100 7 225]]

[[134 159 41]
[ 2 146 221]
[ 99 74 225]
[169 57 59]]]


[[[100 202 3]
[ 88 204 131]
[ 96 238 243]
[103 58 30]]

[[157 125 107]
[238 207 99]
[102 220 64]
[ 27 240 33]]

[[ 74 93 131]
[107 88 206]
[ 55 86 35]
[212 235 187]]]]
y: [ 0.80826157 0.01407595]
X: [[[[ 48 224 119]
[ 76 87 174]
[ 14 88 183]
[ 76 234 56]]

[[234 223 65]
[ 63 85 175]
[184 252 125]
[100 7 225]]

[[134 159 41]
[ 2 146 221]
[ 99 74 225]
[169 57 59]]]


[[[100 202 3]
[ 88 204 131]
[ 96 238 243]
[103 58 30]]

[[157 125 107]
[238 207 99]
[102 220 64]
[ 27 240 33]]

[[ 74 93 131]
[107 88 206]
[ 55 86 35]
[212 235 187]]]]
y: [ 0.80826157 0.01407595]
Read lmdb
X_0
[ 48 224 119 76 87 174 14 88 183 76 234 56 234 223 65 63 85 175
184 252 125 100 7 225 134 159 41 2 146 221 99 74 225 169 57 59
100 202 3 88 204 131 96 238 243 103 58 30 157 125 107 238 207 99
102 220 64 27 240 33 74 93 131 107 88 206 55 86 35 212 235 187]
X_1
[ 48 224 119 76 87 174 14 88 183 76 234 56 234 223 65 63 85 175
184 252 125 100 7 225 134 159 41 2 146 221 99 74 225 169 57 59
100 202 3 88 204 131 96 238 243 103 58 30 157 125 107 238 207 99
102 220 64 27 240 33 74 93 131 107 88 206 55 86 35 212 235 187]
y_0
[ 0.80826157 0.01407595]
y_1
[ 0.80826157 0.01407595]
n_samples 4

最佳答案

将您的交易包装在 with 下。并记住使用 np.fromstring 将值从字节(字符串)转换回 numpy 数组.

老实说,将 numpy 数组存储在 lmdb 中并不是一个好主意,因为从数组到字节再返回到数组的转换会丢失一些信息(例如形状)。您可以尝试使用 pickle 存储 numpy 数组的字典.

def write_lmdb(filename):
...
with lmdb_env.begin(write=True) as lmdb_txn:
...

def read_lmdb(filename):
...
with lmdb_env.begin() as lmdb_txn:
with lmdb_txn.cursor() as lmdb_cursor:
...
print np.fromstring(value, dtype=np.float64)

关于python - 将 numpy 数组写入 lmdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44266384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com