【问题标题】:Quick way to access first element in Numpy array with arbitrary number of dimensions?快速访问具有任意维数的 Numpy 数组中的第一个元素的方法?
【发布时间】:2016-04-03 22:30:05
【问题描述】:

我有一个函数,我想快速访问给定 Numpy 数组的第一个(又名第零个)元素,它本身可能有任意数量的维度。最快的方法是什么?

我目前正在使用以下内容:

a.reshape(-1)[0]

这将可能是多维数组重塑为一维数组,并抓取第零个元素,该元素短、甜且通常快速。但是,我认为这对于某些数组效果不佳,例如,一个大数组的转置视图的数组,因为我担心这最终需要创建一个副本,而不仅仅是原始数组的另一个视图,以便让一切都按正确的顺序排列。 (是这样吗?还是我不必要地担心?)无论如何,感觉这比我真正需要的工作要多,所以我想你们中的一些人可能知道通常更快的方法?

我考虑过的其他选项是在整个数组上创建一个迭代器并从中仅绘制一个元素,或者创建一个零向量,其中每个维度包含一个零,并使用它来对数组进行花式索引。但这些似乎都不是那么好。

【问题讨论】:

  • “或者我是在无谓地担心?”不,你不是在无谓地担心!根据a 的内存布局,a.reshape(-1) 可能会导致复制,当您只关心第一个元素时,这肯定是矫枉过正。

标签: python numpy


【解决方案1】:
a.flat[0]

这应该非常快,并且永远不需要副本。 (注意a.flatnumpy.flatiter的一个实例,而不是一个数组,这就是为什么这个操作可以在没有副本的情况下完成。)

【讨论】:

    【解决方案2】:

    你可以使用a.item(0);请参阅numpy.ndarray.item 的文档。

    这种方法的一个可能缺点是返回值是 Python 数据类型,而不是 numpy 对象。例如,如果a 的数据类型为numpy.uint8,则a.item(0) 将是一个Python 整数。如果这是一个问题,a.flat[0] 更好——请参阅@user2357112 的答案。

    【讨论】:

    • 这也是一个可能的优势,具体取决于您打算如何处理该元素。
    【解决方案3】:
    ## y -- numpy array of shape (1, Ty)
    

    如果要获取第一个元素:

    使用y.shape[0]

    如果要获取第二个元素:

    使用y.shape[1]

    来源: https://docs.scipy.org/doc/numpy/reference/generated/numpy.take.html

    您还可以使用 take 进行更复杂的提取(获取少量元素):

    numpy.take(a, indices, axis=None, out=None, mode='raise')[来源] Take 沿轴的数组中的元素。

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 2019-02-22
      • 2021-01-01
      • 2023-03-14
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多