n维(n> 1)numpy数组中A [i]和A [i ,:]有什么区别?

时间:2018-09-17 04:59:53

标签: python arrays numpy indexing

假设X是一个n维(n> 1)的numpy数组。

X [i]和X [i ,:]之间有什么区别吗?

例如

X = np.zeros((3,3))

print(X[i])
 #[ 0.  0.  0.]
print(X[i,:])
 #[ 0.  0.  0.]

我认为这完全相同,但是我认为

访问速度的条款。

但是我不清楚。

3 个答案:

答案 0 :(得分:4)

https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#basic-slicing-and-indexing

  

如果选择元组中的对象数少于N,则对于任何后续维,均假定:。

     

一个整数i返回与i:i + 1相同的值,不同之处在于返回的对象的维数减少了1。特别是,第p个元素为整数的选择元组(以及所有其他条目: )返回尺寸为N-1的相应子数组。

它们是相同的。如另一个答案所示,时序有所不同,但是时间在ns中,在此Python的解析时间和函数调用层可以有所不同。但我欢迎根据实际读取的numpy代码进行的任何更正。

In [190]: X = np.zeros((3,3))
In [191]: X.__array_interface__
Out[191]: 
{'data': (45249072, False),
 'strides': None,
 'descr': [('', '<f8')],
 'typestr': '<f8',
 'shape': (3, 3),
 'version': 3}

切片属性相同:

In [192]: X[0].__array_interface__
Out[192]: 
{'data': (45249072, False),
 'strides': None,
 'descr': [('', '<f8')],
 'typestr': '<f8',
 'shape': (3,),
 'version': 3}
In [193]: X[0,:].__array_interface__
Out[193]: 
{'data': (45249072, False),
 'strides': None,
 'descr': [('', '<f8')],
 'typestr': '<f8',
 'shape': (3,),
 'version': 3}

时间:

In [194]: timeit X[0]
172 ns ± 2.43 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [195]: timeit X[0,...]
175 ns ± 0.105 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [196]: timeit X[0,:]
264 ns ± 15 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

比较返回副本的时间(相对于视图):

In [199]: timeit X[[0]]
6.73 µs ± 48.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

和相同的列索引:

In [206]: timeit X[:,1]
262 ns ± 5.68 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [207]: timeit X[...,1]
177 ns ± 2.15 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

(对于更大的数组,我得到相同的时间-支持这样的想法,即在解析/设置过程中会发生任何时间差异,而不是在视图的实际构建过程中。)

答案 1 :(得分:1)

切片速度相对较慢。我已经证明使用%timeit。它测量执行时间。

%timeit (X[0])
10000000 loops, best of 3: 163 ns per loop

带有切片:

%timeit (X[0, :])
1000000 loops, best of 3: 245 ns per loop

答案 2 :(得分:0)

X [i]是X的第i个列表

X [i ,:]是从X的第i个列表中分割数据

您得到的结果相同,但实际上却有所不同。