python区别之[:j]和[:,j]或者双冒号[::],python冒号在数组和矩阵使用

a = [[1,2,3,4],[2,3,4,5],[5,6,7,8]]
b = np.array([[1,2,3,4],[2,3,4,5],[5,6,7,8]])      

上面就是我要举例子的数据对象 ------下面还有原因解释,有进阶追求的可看,入门者可不看。

1.关于 [:j] 或者 [:i]:这是切片操作,在下标 i 或者 j 之前的元素都保留,适用于Python中的list(也就是数组),也适用于numpy科学结构(array等)。

下面用list来表示

# a是Python的一个列表(数据结构上叫做数组)
In [64]: a                                                                      
Out[64]: [[1, 2, 3, 4], [2, 3, 4, 5], [5, 6, 7, 8]]
 
# 例子1
In [65]: a[:2]                                                                  
Out[65]: [[1, 2, 3, 4], [2, 3, 4, 5]]
# 例子2
In [66]: a[1][:3]                                                               
Out[66]: [2, 3, 4]

2. 关于[:,j] 或者 [:,i] :这也是切片操作,不同的是:保留第一个维度所有元素,第二维度元素保留到j;只适用numpy的科学数据结构

下面用numpy的数据结构举例

# b是一个numpy科学数据结构,格式是array
In [76]: b                                                                      
Out[76]: array([[1, 2, 3, 4],
       [2, 3, 4, 5],
       [5, 6, 7, 8]])
# 例子1
In [77]: b[:,2]                                                                 
Out[77]: array([3, 4, 7])
# 例子2
In [78]: b[:,3]                                                                 
Out[78]: array([4, 5, 8])
 
# 看看反面例子,如果是list结构的话
In [6]: x
Out[6]: [[1, 2, 3, 4], [2, 3, 4, 5], [5, 6, 7, 8]]
 
In [5]: x[:,:2]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-4b22ebda2101> in <module>()
----> 1 x[:,:2]
 
TypeError: list indices must be integers or slices, not tuple

根据《python核心编程》和《Python数据分析第二版》可以得到以下两个定义。

定义一:在list里面,只存在元素,不存在元素中的元素;list里元素就是最小的成分,不可以再切片。

定义二:在array中(numpy的数据都可以)最后一个维度的数据才可以叫做元素,同样元素不可切分。

结合例子解释定义一:就算是二维、三维的list,元素就是axis=0的数据,例如上面的数据x=[[1,2,3,4],[2,3,4,5],[5,6,7,8]],元素就是[1,2,3,4]或者[2,3,4,5]或者[5,6,7,8],而不是更里面的数字1等等;在二维列表中写下x[:],但是不可以写x[:,:],根据定义一,第二个切片操作是不合法的。

定义二不需要解释,大家都懂得。

这时候我们就可以去理解[::]操作了

3.关于[::]操作(高阶用法,可看可不看,一般出现在矩阵数据替换运算,例如NLP里的位置编码)。在list中可以用在元素层面,在numpy的数学数据中可以用在任何层面。

使用方法[start: end : step ],也就是[ 起始下标 : 终止下标 : 间隔距离 ]

切片范围是: start <= x < end,注意:一个小于等于,一个小于

举例

# 关于array的科学数据
In [5]: x = np.random.randint(1,10,(3,6))
 
In [6]: x
Out[6]: 
array([[9, 3, 2, 3, 8, 4],
       [3, 5, 6, 8, 4, 3],
       [8, 5, 5, 2, 5, 8]])
 
In [7]: x[:, 0:2:2]
Out[7]: 
array([[9],
       [3],
       [8]])
 
In [8]: x[:, :2:2]  
Out[8]: 
array([[9],
       [3],
       [8]])
 
In [9]: x[:, ::2]
Out[9]: 
array([[9, 2, 8],
       [3, 6, 4],
       [8, 5, 5]])
 
# 关于List
In [10]: d =[[3, 4, 8, 8, 8, 9],
    ...:        [8, 9, 6, 3, 4, 9],
    ...:        [6, 7, 6, 6, 7, 1]]
    ...:        
# 在元素层面,切片是可以用的
In [11]: d
Out[11]: [[3, 4, 8, 8, 8, 9], [8, 9, 6, 3, 4, 9], [6, 7, 6, 6, 7, 1]]
 
In [12]: d[::2]
Out[12]: [[3, 4, 8, 8, 8, 9], [6, 7, 6, 6, 7, 1]]
 
In [13]: d[:2:2]
Out[13]: [[3, 4, 8, 8, 8, 9]]
 
In [14]: d[0:2:2]
Out[14]: [[3, 4, 8, 8, 8, 9]]
 
# 下面不可以用了,因为逗号就代表你认为元素还可以切分,这是和定义一冲突的。
In [15]: d[1,::2]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-32535642f99b> in <module>()
----> 1 d[1,::2]
 
TypeError: list indices must be integers or slices, not tuple
发布了75 篇原创文章 · 获赞 34 · 访问量 2022

猜你喜欢

转载自blog.csdn.net/chongchujianghu3/article/details/105197442