【问题标题】:Python 3 split array into chunks starting from certain positionPython 3 从某个位置开始将数组拆分为块
【发布时间】:2017-12-30 18:44:27
【问题描述】:

我有一个形状为 (19, 73984) 的 python 数组 - 这代表 19 个 272 x 272px 大小的灰色扁平图像。我希望能够处理它并将其输入前馈神经网络,但我希望能够分批输入它。 我希望有某种将在 for 循环中运行的函数。该函数应该接收数据集数组、批量大小以及迭代的索引值,以便知道应该返回多少项目以及从哪个位置返回。 前任: def get_batch_data(i, dataset, batch_size):

其中i 是一个for 循环迭代索引,用于返回从某个位置开始的数据块,直到dataset 循环结束。 有没有更好的方法来做到这一点,或者你能帮我解决这个问题吗? 谢谢!

【问题讨论】:

  • 为什么是批处理文件标签?如果你的数据已经在 Python 数组中,为什么不直接留在 Python 环境中呢?
  • 恐怕我不明白你在暗示什么
  • 问题是 - 什么构成 有用的块...看起来您已经有一个方便的 19 项图像的夹盘数组...不适合你/你想解决什么问题?
  • 我很抱歉没有解释清楚。目前,它们是 19,这似乎是要输入 NN 的一大块数据。但我试图找到一个好的机制,假设这 19 个会是一个更大的数字(例如:数千个)。在这种情况下,块功能会派上用场。
  • 我的意思是你可以随意分块任何东西,但在这种情况下,它需要对你的神经网络有意义。如果您有一千个图像文件,那么您将遍历图像文件并一次执行一个。如果您有一个多千兆字节的文件,您可能希望以 123456 字节的块读取它并使用它们。或者您可能想要获取一个基本数组并在其上执行 N 个突变并发送每个突变数组。当然 - 人们可以给你最好的猜测答案,但如果没有一些特定的标准,他们是否会对你有任何好处是不确定的。

标签: python arrays function


【解决方案1】:

测试数据:

bigArr = [[x,x+1,x+2,x+3] for x in range(1,1000,4) ] # 250 subLists

最简单的可能是islice() 来自itertools

print(list(itertools.islice(bigArr,5,10)))) # start 5, stop 10, implicit 1 step

Doku:islice() 获取您的列表、start 值、stop 值和 stepper - 并按照您的要求做单行。


您还可以利用itertools.compress 与滑动True 窗口为您想要的元素:

# only show 5 to 10th (excluded) element:
varParts = itertools.compress(bigArr, # first list 
           [1 if x in range(5,10) else 0 for x in range(len(bigArr))]) # second list

# consume iterator:
print(list(varParts)) 

Compress 仅返回第一个列表中第二个列表中评估为 True 的值 - 第二个列表的构建方式是只有想要的元素评估为 True

独库:compress


或者像这样对大数组使用切片手动完成所有操作:

def get_batch_data(i, arr, batchSize): 
    return arr[i:min(len(arr),i+batchSize)] 

这样使用:

for i in range(0,len(bigArr),5): 
    print(get_batch_data(i,bigArr,5)) # creates sub-slices - wich take memory

【讨论】:

  • 真棒和完整的答案。谢谢楼主!
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多