numpy函数"array_split"在数学上是如何工作的



我需要编写一个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(+2

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

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

14=4+4+3+3

一般来说,我们所做的是在输出列表的第一个(余项(项中添加一个,留下代码片段

...remainder * [quotient+1]...

在输出中的(商(项中,我们添加了第一个(余数(项,剩下下一个(商余数(项来填充

...(Nsections- remainder) * [quotient])

给我们留下最后的代码。

有人能告诉我这种运算叫什么,或者它涉及数学的哪个分支吗?因为这不是我以前遇到过的。

我相信这与数论有着松散的联系,商余数定理可能是你学习它的第一件事。

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

相关内容

最新更新