【问题标题】:Python array, getting every n entries, then moving onto the next n entries until the end of the arrayPython 数组,获取每 n 个条目,然后移动到下一个 n 条目,直到数组末尾
【发布时间】:2021-07-21 02:10:22
【问题描述】:

我有一个包含 4,050,000 个条目的一维 numpy 数组,我将调用 image_t。我试图以这样一种方式对其进行切片,即检索前 10,000 个条目,即 image_t[0:10000],然后下一步将是 image_t[10000:20000],依此类推,直到它到达最后一个切片。

这最终会给我 405 个不同的数组,每个数组有 10,000 个条目。我的问题是我尝试了许多不同类型的循环,但我不确定出了什么问题。

我试过了:

将其定义为函数


def d_slice(S,step1):
    return [S[i::step] for i in range(step)]

这不起作用,因为它返回 10,000 个数组,每个数组包含 405 个条目,这意味着它每 405 个条目计数一次。

我尝试在循环内开始停止:

def s_t_slice(S):
    for i in np.arange(0,4050000, 10000):
        start = i
        end = i + 10000
        print(i)
        return S[start:end]

在这里,我希望如果我告诉数组从 i 到 i + 10000 切片,它会按照我在第一段中解释的那样做。不幸的是,程序在 i = 0 之后就死掉了。不知道为什么。

接下来我尝试创建一个 405 长的空数组列表并跳过该函数。

im_array = [[] for i in range(1,406)]

for i in range(0,405):
    for j in range(0,4050000,10000):
    print(j)
    k = j + 10000
    im_array[k] = image_t[j:k]

这很有效,因为我设法获得了 405 个数组,每个数组包含 10,000 个条目,但这些条目与整个数组中的条目不匹配(即 im_array[0] 与 image_t[0:10000] 等不同) .

我很确定我快要破解它了,但我可以用手知道我缺少什么。

【问题讨论】:

    标签: python arrays function for-loop numpy-slicing


    【解决方案1】:

    你可以使用 np.array_split()。以下代码应该可以工作:

    split_array = np.array_split(img_t, 405)
    

    现在 split_array 变量是 405 个数组的列表,每个数组的形状为 (10000,)

    【讨论】:

      【解决方案2】:

      试试这个:

      import numpy as np
      
      arr = np.arange(4050000)
      arr = np.split(405) # split the array up into sections
      

      编辑: Seermer 在下面的回答也将起作用。但是,根据 numpy 文档,有一个关键的区别。

      这些函数之间的唯一区别是 array_split 允许 indices_or_sections 是一个不等分轴的整数。对于一个长度为 l 的数组,应该分成 n 个部分,它返回 l % n 个大小为 l//n + 1 的子数组和其余大小为 l//n 的子数组。

      参见array_split 与split

      为了您所做的事情,我建议使用split 而不是array_split。

      【讨论】:

      • 你为什么推荐split而不是array_split?
      • 因为 OP 很可能想要均分。如果您使用拆分,如果您尝试将数组划分为某种不相等的方式,它将引发ValueError: array split does not result in an equal division。 array_split 在最后做模以使其工作。
      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 2022-11-15
      • 2021-12-28
      • 1970-01-01
      • 2016-11-26
      • 2021-11-15
      相关资源
      最近更新 更多