亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

來自 io.BytesIO 流的 numpy.load

來自 io.BytesIO 流的 numpy.load

米琪卡哇伊 2022-01-05 20:00:29
我在 Azure Blob 存儲中保存了 numpy 數組,我正在將它們加載到這樣的流中:stream = io.BytesIO() store.get_blob_to_stream(container, 'cat.npy', stream)我從中知道stream.getvalue()流包含用于重建數組的元數據。這是前 150 個字節:b"\x93NUMPY\x01\x00v\x00{'descr': '|u1', 'fortran_order': False, 'shape': (720, 1280, 3), }                                                  \n\xc1\xb0\x94\xc2\xb1\x95\xc3\xb2\x96\xc4\xb3\x97\xc5\xb4\x98\xc6\xb5\x99\xc7\xb6\x9a\xc7"是否可以使用numpy.load或通過其他一些簡單的方法加載字節流?我可以將陣列保存到磁盤并從磁盤加載它,但出于多種原因我想避免這種情況......編輯:只是為了強調,輸出需要是一個 numpy 數組,其形狀和數據類型在流的第 128 個字節中指定。
查看完整描述

3 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

我嘗試使用幾種方法來實現您的需求。


這是我的示例代碼。


from azure.storage.blob.baseblobservice import BaseBlobService

import numpy as np


account_name = '<your account name>'

account_key = '<your account key>'

container_name = '<your container name>'

blob_name = '<your blob name>'


blob_service = BaseBlobService(

    account_name=account_name,

    account_key=account_key

)

示例 1. 使用 sas 令牌生成 blob url 以通過以下方式獲取內容 requests


from azure.storage.blob import BlobPermissions

from datetime import datetime, timedelta

import requests


sas_token = blob_service.generate_blob_shared_access_signature(container_name, blob_name, permission=BlobPermissions.READ, expiry=datetime.utcnow() + timedelta(hours=1))

print(sas_token)

url_with_sas = blob_service.make_blob_url(container_name, blob_name, sas_token=sas_token)

print(url_with_sas)


r = requests.get(url_with_sas)

dat = np.frombuffer(r.content)

print('from requests', dat)

示例 2. 通過以下方式將 blob 的內容下載到內存中 BytesIO


import io

stream = io.BytesIO()

blob_service.get_blob_to_stream(container_name, blob_name, stream)

dat = np.frombuffer(stream.getbuffer())

print('from BytesIO', dat)

示例 3. 使用numpy.fromfilewithDataSource打開帶有 sas 令牌的 blob url,它實際上會將 blob 文件下載到本地文件系統中。


ds = np.DataSource()

# ds = np.DataSource(None)  # use with temporary file

# ds = np.DataSource(path) # use with path like `data/`

f = ds.open(url_with_sas)

dat = np.fromfile(f)

print('from DataSource', dat)

我認為示例 1 和 2 更適合您。


查看完整回答
反對 回復 2022-01-05
?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

當涉及到 np.savez 時,上述解決方案通常需要工作。


上傳到存儲:

import io    

import numpy as np    


stream = io.BytesIO()  

arr1 = np.random.rand(20,4)  

arr2 = np.random.rand(20,4)  

np.savez(stream, A=arr1, B=arr2)  

block_blob_service.create_blob_from_bytes(container, 

                                          "my/path.npz", 

                                          stream.getvalue())

從存儲下載:

from numpy.lib.npyio import NpzFile 


stream = io.BytesIO()  

block_blob_service.get_blob_to_stream(container, "my/path.npz", stream)  


ret = NpzFile(stream, own_fid=True, allow_pickle=True)  

print(ret.files)  

""" ['A', 'B'] """  

print(ret['A'].shape)  

""" (20, 4) """  


查看完整回答
反對 回復 2022-01-05
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

有點晚了,但如果有人想使用 numpy.load 執行此操作,這里是代碼(Azure SDK v12.8.1):


from azure.storage.blob import BlobServiceClient

import io

import numpy as np


# define your connection parameters

connect_str = ''

container_name = ''

blob_name = ''


blob_service_client = BlobServiceClient.from_connection_string(connect_str)


blob_client = blob_service_client.get_blob_client(container=container_name,

                                                  blob=blob_name)


# Get StorageStreamDownloader

blob_stream = blob_client.download_blob()

stream = io.BytesIO()

blob_stream.download_to_stream(stream)

stream.seek(0)


# Load form io.BytesIO object

data = np.load(stream, allow_pickle=False)


print(data.shape)


查看完整回答
反對 回復 2022-01-05
  • 3 回答
  • 0 關注
  • 316 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號