numpy.split 返回列表而不是数组的理由是什么?
Rationale for numpy.split returning a list and not an array?
令我惊讶的是 numpy.split
产生了 list
而不是 array
。我原以为 return 和 array
会更好,因为 numpy
已经投入大量工作来使数组比列表更有用。任何人都可以证明 numpy
return 使用 list
而不是 array
是合理的吗?为什么这会是 numpy 开发人员做出的更好的编程决定?
有评论指出,如果切缝不均匀,结果不可能是数组,至少不能是相同的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
换句话说,它只是遍历数组和 returns 个连续的切片。这些(通常)是对原作的看法。
所以 split
并不是一个复杂的函数。您可以自己生成这样的子数组列表,而无需大量的 numpy 专业知识。
还有一点。文档指出 split
可以用适当的 stack
反转。 concatenate
(和家族)采用数组列表。如果给出一个数组数组,或者一个更高的 dim 数组,它会有效地迭代第一维,例如concatenate(arr) => concatenate(list(arr))
.
实际上你是对的return是一个列表
import numpy as np
a=np.random.randint(1,30,(2,2))
b=np.hsplit(a,2)
type(b)
它将 return type(b)
作为列表 所以,文档中没有任何错误,我也首先认为文档是错误的它没有 return 数组,但是当我检查
type(b[0])
type(b[1])
它 returned 类型为 ndarray。
这意味着它 return 是 ndarrary 的列表。
令我惊讶的是 numpy.split
产生了 list
而不是 array
。我原以为 return 和 array
会更好,因为 numpy
已经投入大量工作来使数组比列表更有用。任何人都可以证明 numpy
return 使用 list
而不是 array
是合理的吗?为什么这会是 numpy 开发人员做出的更好的编程决定?
有评论指出,如果切缝不均匀,结果不可能是数组,至少不能是相同的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
换句话说,它只是遍历数组和 returns 个连续的切片。这些(通常)是对原作的看法。
所以 split
并不是一个复杂的函数。您可以自己生成这样的子数组列表,而无需大量的 numpy 专业知识。
还有一点。文档指出 split
可以用适当的 stack
反转。 concatenate
(和家族)采用数组列表。如果给出一个数组数组,或者一个更高的 dim 数组,它会有效地迭代第一维,例如concatenate(arr) => concatenate(list(arr))
.
实际上你是对的return是一个列表
import numpy as np
a=np.random.randint(1,30,(2,2))
b=np.hsplit(a,2)
type(b)
它将 return type(b)
作为列表 所以,文档中没有任何错误,我也首先认为文档是错误的它没有 return 数组,但是当我检查
type(b[0])
type(b[1])
它 returned 类型为 ndarray。
这意味着它 return 是 ndarrary 的列表。