【问题标题】:Rationale for numpy.split returning a list and not an array?numpy.split 返回列表而不是数组的基本原理?
【发布时间】:2019-01-11 15:47:12
【问题描述】:

我很惊讶numpy.split 产生了list 而不是array。我原以为返回array 会更好,因为numpy 已经投入了大量工作来使数组比列表更有用。任何人都可以证明 numpy 返回 list 而不是 array 是合理的吗?为什么这对 numpy 开发人员来说是一个更好的编程决策?

【问题讨论】:

  • 我想是因为np.split 可以返回一个锯齿状列表,而 numpy 数组无法很好地处理它。
  • 可以进入软件工程专业
  • 查看np.split(np.arange(10), [2, 4])) 的输出。尝试将该结果放入对象 dtype 的(锯齿状)数组中 - 不是那么有用。

标签: python numpy design-decisions


【解决方案1】:

有评论指出,如果狭缝不均匀,则结果不能是数组,至少不能是具有相同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(和家人)获取数组列表。如果给定一个数组数组或更高的暗淡数组,它会有效地迭代第一个维度,例如concatenate(arr) => concatenate(list(arr)).

【讨论】:

    【解决方案2】:

    其实你是对的它返回一个列表

    import numpy as np 
    a=np.random.randint(1,30,(2,2))
    b=np.hsplit(a,2)
    type(b)
    

    它将以列表形式返回type(b),所以文档中没有任何问题,我也首先认为文档有误它没有返回数组,但是当我检查时

    type(b[0])
    type(b[1])
    

    它返回类型为 ndarray。

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

    【讨论】:

      猜你喜欢
      • 2017-05-24
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多