gpt4 book ai didi

python - numpy 函数 `array_split` 在数学上是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 11:01:55 25 4
gpt4 key购买 nike

我需要编写一个 Python 函数,当传递一个数组和一个整数 N 时,返回将数组的内容分成 N 个相等大小的子数组。

如果数组的长度不能被 N 等分,则最终的子数组必须具有合适的长度以容纳剩余的元素。

例子:split_array(array=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], n=4)
应该输出:[[1, 2, 3], [4, 5, 6], [7, 8], [9, 10]]
我的研究表明 numpy.array_split函数正是这样做的,我查看了 GitHub 上的源代码并发现它首先组成一个数组,其中包含子数组的所有大小,然后迭代以拆分原始数组。

来自 numpy.array_split 的删节示例

def array_split(ary, indices_or_sections, axis=0):
# indices_or_sections is a scalar, not an array.
Nsections = int(indices_or_sections)
if Nsections <= 0:
raise ValueError('number sections must be larger than 0.')
Neach_section, extras = divmod(Ntotal, Nsections)
section_sizes = ([0] +
extras * [Neach_section+1] +
(Nsections-extras) * [Neach_section])
div_points = _nx.array(section_sizes, dtype=_nx.intp).cumsum()

sub_arys = []
sary = _nx.swapaxes(ary, axis, 0)
for i in range(Nsections):
st = div_points[i]
end = div_points[i + 1]
sub_arys.append(_nx.swapaxes(sary[st:end], axis, 0))

return sub_arys

我唯一难以理解的是变量 section_sizes 是如何变化的。是用数学方法创建的。
例如 split_array(array=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], n=4)它构建了一个大小列表,即 [3, 3, 2, 2]这正是我需要的,但我不明白它为什么有效。

我明白 divmod(Ntotal, Nsections)将为您提供除法计算的商( Neach_section )和余数( extras )。

但是为什么 quotient * [remainder+1]总是给你正确大小的“商”子数组大小的正确数量(在这个例子中 [3, 3])?

为什么 [quotient-remainder] * quotient给你正确大小的“剩余”子数组大小的正确数量(在这个例子中[2, 2])?

有人甚至可以告诉我这种操作称为什么,或者这涉及哪个数学分支,因为这不是我以前遇到过的。

最佳答案

为了清楚起见,我会引用这个:

Neach_section, extras = divmod(Ntotal, Nsections)
section_sizes = ([0] +
extras * [Neach_section+1] +
(Nsections-extras) * [Neach_section])

作为
quotient, remainder = divmod(Ntotal, Nsections)
section_sizes = ([0] +
remainder * [quotient+1] +
(Nsections- remainder) * [quotient])

首先让我们想象一个与您的问题中显示的案例类似的案例。 (修改商数!= 余数)
print(np.array_split(np.arange(1,15),4) 
>>>[array([1, 2, 3, 4]), array([5, 6, 7, 8]), array([ 9, 10, 11]), array([12, 13, 14])]

根据这最终代表的划分来思考它更容易。

14 = 4*3 + 2

这也与

14 = (3 + 3 + 3 + 3) + 2

= (3 + 3 + 3 + 3) + (1 + 1)

至关重要的是,我们可以将这些添加到第一个括号中的前两项。

14 = 4 + 4 + 3 + 3

一般来说,我们所做的是在输出列表的第一个(剩余)项中添加一个,留下代码片段
...remainder * [quotient+1]...

在输出中的(商)项中,我们添加了第一个(余数)项,剩下的(商-余数)项要填充
...(Nsections- remainder) * [quotient])

留给我们最终的代码。

Could someone even just tell me what this kind of operation is called or what branch of mathematics this deals with as it's not something I've come across before.



我相信这与数论松散相关,商余数定理可能是您为此学习的第一件事。

无论如何,我希望有帮助:)

关于python - numpy 函数 `array_split` 在数学上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58756377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com