【问题标题】:Load in specific rows of numpy array加载特定行的 numpy 数组
【发布时间】:2021-08-11 13:04:59
【问题描述】:

我已经使用 np.savez() 保存了一个 numpy 数组,并打开它:

a = np.load('/file.npz', allow_pickle=True)
a = cp.array(a['arr_0'])

但是如何读取数组a 的特定行?我知道我可以通过 a[x:y] 访问某些行,其中 x 和 y 是常数,因此 xa 非常大。每次都加载整个东西似乎效率低下。

非常感谢在索引 x 和 y 之间的特定行中加载比以典型方式加载更快的任何帮助!建议在答案中使用 memmap 的答案,但这不会提高速度。提前感谢您的帮助:)

【问题讨论】:

  • 您应该可以通过设置mmap_modenp.load 来做到这一点。像a = np.load('/file.npz', allow_pickle=True, mmap_mode='r') 这样的东西。虽然我对这个选项不太熟悉,所以我不能确定它是否适用于这种文件格式。 numpy.org/doc/stable/reference/generated/numpy.load.html
  • 感谢@KyleParsons 的建议,但在numpy.org/doc/stable/reference/generated/… 上它说:“r”:打开现有文件以只读方式。 ‘r+’:打开现有文件进行读写。 ‘w+’:创建或覆盖现有文件进行读写。 ‘c’:写时复制:分配影响内存中的数据,但不保存更改。我认为这些选项中的任何一个都无法实现我想要做的事情
  • 你说你想访问一行。这不就是读书的意思吗?这些选项未涵盖您想要做什么?
  • 据我所知,阅读不允许我从保存的矩阵中选择要打开的 x 和 y 之间的特定行。会@KyleParsons 吗?
  • 这就是内存映射的作用。它将“打开”您的整个文件,但在这种情况下,打开不会将其加载到 RAM 中,它只会指向硬盘驱动器上的某个位置。然后,当您对数组执行某些操作时,它会将其加载到 RAM 中,但它可以选择性地将一部分加载到 RAM 中,这应该更快并且需要更少的 RAM。

标签: python arrays numpy pickle


【解决方案1】:

不确定我是否正确,但从@KyleParsons 评论中,我得到了:


import numpy as np
import sys

arr = np.random.randint(0,999,(100,5))

print(arr,'\n ARR SIZE :', sys.getsizeof(arr))


# for i in range(arr.shape[0]):
#     arr_row = np.copy(arr[i])
#     print(i , '  :  ',arr_row)
    
    
np.save('test_100_X_5', arr)    


a = np.load('test_100_X_5.npy', allow_pickle=True, mmap_mode='r')

print('\na : ',type(a), 'SIZE : ',  sys.getsizeof(a),'\n')

for i in range(a.shape[0]):
    a_row = np.copy(a[i])
    print(i , '  :  ',a_row,' size :', sys.getsizeof(a_row))
    

查看加载对象的大小:'a' vs 整个数组:'arr' 和单行:('i')

PS

如有错误请指正,我也在努力学习numpy

【讨论】:

  • Ahhh 好的,谢谢我明白了,如果我错了,请纠正我,但这实际上打开了整个矩阵,但它的一个较小版本(由 sys.getsizeof() 定义)然后我索引我的行想要,对吧?
  • 我用mmap_mode='r' 和默认选项计算了加载test_100_x_5 数组所需的时间。令人惊讶的是,使用mmap_mode='r' 加载它为您的数组花费了两倍的时间......看起来这个解决方案可能比使用a = np.load('test_100_X_5.npy', allow_pickle=True) 加载整个数组并索引列效率低。
  • 制作一个 mmap 数组然后一次读取一行需要更长的时间,但是制作一个 mmap 数组并读取它应该花费更少的时间一行。
  • 感谢@KyleParsons 的解释,感谢代码 pippo1980
  • 我是否需要复制我使用np.copy() 加载的数组才能编辑它们@KyleParsons?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2014-05-20
相关资源
最近更新 更多