如何拆分 NumPy 数组以使子数组的长度均匀分布?

问题描述 投票:0回答:1

我是 NumPy 的新手,仍然想知道使用内置函数可以轻松做什么,而不是自己动手。

我正在尝试分割一个数组,但让子数组中的不均匀性均匀分布在整个结果中。

为了说明这一点,如果我在 numpy 中运行以下命令:

a = np.arange(17)
for c in [3, 5, 10]:
  chunks = np.array_split(a, c)
  sizes = np.array([x.size for x in chunks])
  print(f'{c} chunks sizes: {sizes}')

我得到的输出是:

3 chunks sizes: [6 6 5]
5 chunks sizes: [4 4 3 3 3]
10 chunks sizes: [2 2 2 2 2 2 2 1 1 1]

我希望它逐渐设置尺寸以调整不均匀性,而不是贪婪地调整。换句话说,我希望输出看起来更像:

3 chunks sizes: [6 5 6]
5 chunks sizes: [3 4 3 4 3]
10 chunks sizes: [2 2 1 2 2 1 2 2 1 2]

是否有一种干净的方法可以使用 NumPy 内置函数来执行此操作,或者是滚动我自己的唯一好方法(根据需要向上/向下舍入)?从到目前为止我在文档中发现的内容来看,我很可能必须自己动手。

python numpy
1个回答
0
投票

仅限 NumPy 的解决方案:

a = np.arange(17)
for c in [3, 5, 10]:
  chunks = np.array_split(a, c)
  sizes = np.array([x.size for x in chunks])
  print(f'{c} chunks sizes: {sizes}')
  alt_sizes = np.diff(np.round(np.average(sizes) * np.arange(0, len(sizes)+1)))
  print(f'  alt: {alt_sizes.astype(int)}')
3 chunks sizes: [6 6 5]
  alt: [6 5 6]
5 chunks sizes: [4 4 3 3 3]
  alt: [3 4 3 4 3]
10 chunks sizes: [2 2 2 2 2 2 2 1 1 1]
  alt: [2 1 2 2 1 2 2 2 1 2]
© www.soinside.com 2019 - 2024. All rights reserved.