返回列表而不是数组的numpy.split的理由?

时间:2018-08-03 17:59:08

标签: python numpy design-decisions

我很惊讶numpy.split产生list而不是array。我本来以为返回一个array会更好,因为numpy已经做了很多工作,使数组比列表更有用。任何人都可以证明numpy返回list而不是array的理由吗?为什么对于numpy开发人员做出更好的编程决定?

2 个答案:

答案 0 :(得分:3)

一条评论指出,如果缝隙不均匀,则结果不能是数组,至少不是具有相同dtype的数组。充其量只能是object dtype。

但是让我们考虑等长子数组的情况:

In [124]: x = np.arange(10)
In [125]: np.split(x,2)
Out[125]: [array([0, 1, 2, 3, 4]), array([5, 6, 7, 8, 9])]
In [126]: np.array(_)     # make an array from that
Out[126]: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

但是我们可以不分割而得到相同的数组-只需重塑:

In [127]: x.reshape(2,-1)
Out[127]: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

现在查看split的代码。它只是将任务传递给array_split。忽略有关替代轴的细节,

sub_arys = []
for i in range(Nsections):
    # st and end from `div_points
    sub_arys.append(sary[st:end])
return sub_arys

换句话说,它只是遍历数组并返回连续的切片。这些(通常)是原始图片的视图。

所以split并不复杂。您可以自己生成这样的子数组列表,而无需大量的numpy专业知识。

另一点。文档指出split可以用适当的stack反转。 concatenate(和族)采用数组列表。如果给出一个数组数组或一个更高的dim数组,它将有效地在第一个维度上进行迭代,例如concatenate(arr) => concatenate(list(arr))

答案 1 :(得分:0)

实际上您是对的,它会返回一个列表

type(b)

它将返回type(b[0]) type(b[1]) 作为列表,因此,文档中没有任何错误,我也首先认为文档是错误的,它不会返回数组,但是当我检查时

{{1}}

它返回的类型为ndarray。

这意味着它返回了ndarrary的列表。