获取多维numpy数组第一个元素的pythonic方法
我正在寻找一种简单的pythonic方法来获取numpy数组的第一个元素,不管它的维度如何。例如:获取多维numpy数组第一个元素的pythonic方法,python,numpy,Python,Numpy,我正在寻找一种简单的pythonic方法来获取numpy数组的第一个元素,不管它的维度如何。例如: a = np.identity(3) a.item(0) # 1.0 对于[1,2,3,4],这将是1 对于[[3,2,4],[4,5,6]它将是3 有没有一种简单的python方法可以做到这一点?使用直接索引: arr[(0,) * arr.ndim] 普通索引表达式中的逗号构成元组。您还可以传入手动构造的元组 您可以通过以下方式获得相同的结果: 另一方面,使用非常诱人的方法并不总是安全的r
a = np.identity(3)
a.item(0)
# 1.0
对于[1,2,3,4]
,这将是1
对于[[3,2,4],[4,5,6]
它将是3
有没有一种简单的python方法可以做到这一点?使用直接索引:
arr[(0,) * arr.ndim]
普通索引表达式中的逗号构成元组。您还可以传入手动构造的元组
您可以通过以下方式获得相同的结果:
另一方面,使用非常诱人的方法并不总是安全的ravel
通常会返回一个视图,但是如果您的数组是非连续的,它会复制整个视图
一个相对便宜的解决方案是
arr.flat[0]
是一个可索引迭代器。它不会复制您的数据。使用直接索引:
arr[(0,) * arr.ndim]
普通索引表达式中的逗号构成元组。您还可以传入手动构造的元组
您可以通过以下方式获得相同的结果:
另一方面,使用非常诱人的方法并不总是安全的ravel
通常会返回一个视图,但是如果您的数组是非连续的,它会复制整个视图
一个相对便宜的解决方案是
arr.flat[0]
是一个可索引迭代器。它不会复制您的数据。请考虑使用
.item
,例如:
a = np.identity(3)
a.item(0)
# 1.0
但请注意,与常规索引不同,.item
努力返回本机Python对象,因此,例如,np.uint8
将作为纯整数返回
如果这是可以接受的,那么这种方法似乎比其他方法快一点:
timeit(lambda:a.flat[0])
# 0.3602013469208032
timeit(lambda:a[a.ndim*(0,)])
# 0.3502263119444251
timeit(lambda:a.item(0))
# 0.2366882530041039
考虑使用
.item
,例如:
a = np.identity(3)
a.item(0)
# 1.0
但请注意,与常规索引不同,.item
努力返回本机Python对象,因此,例如,np.uint8
将作为纯整数返回
如果这是可以接受的,那么这种方法似乎比其他方法快一点:
timeit(lambda:a.flat[0])
# 0.3602013469208032
timeit(lambda:a[a.ndim*(0,)])
# 0.3502263119444251
timeit(lambda:a.item(0))
# 0.2366882530041039
arr.ravel()[0]
,基本上将其展平并访问第一项。@cs95。这是我的第一个想法,但如果数组不连续,它可以创建整个对象的副本。arr.flat[0]
应该足够了。arr.ravel()[0]
,基本上是将其展平并访问第一项。@cs95。这是我的第一个想法,但如果数组不连续,它可以创建整个对象的副本。arr.flat[0]
应该足够了。np.unravel_index(0,arr.shape)
是创建n-d索引的另一种方法。@hpaulj。谢谢补充。我还发现了flat
np。解开索引(0,arr.shape)
是另一种创建n-d索引的方法。@hpaulj。谢谢补充。我还发现flat