假设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.]
我认为这完全相同,但是我认为
访问速度的条款。
但是我不清楚。
答案 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个列表中分割数据
您得到的结果相同,但实际上却有所不同。