NumPy中生成和堆叠数组、生成切片的特殊对象:np.r_ np.c_ np.s_
在NumPy中有三个特殊的对象,非常好用:
- np.r_:按行连接两个数组,也就是将两个数组垂直堆叠。
- np.c_:按列连接两个数组,也就是将两个数组水平堆叠。
- np.s_:生成用于切片的slice对象。
下面详细介绍用法:
numpy.r_
将切片或对象沿第一个轴连接,语法:
np.c_[...]
1. 索引为切片
如果索引表达式包含切片符号或标量,则创建一个范围由切片符号指定的一维数组。
切片符号 start:stop:step 相当于 np.arange(start, stop, step) 。
np.r_[0:10:2] # array([0, 2, 4, 6, 8])
如果step为虚数则相当于 np.linspace(start, stop, step, endpoint=1) 。
np.r_[-1:1:6j] # array([-1. , -0.6, -0.2, 0.2, 0.6, 1. ])
切片展开后,所有逗号分隔的序列都会被连起来。
np.r_[-1:1:6j, [0]*3, 5, 6]
# array([-1. , -0.6, -0.2, 0.2, 0.6, 1. , 0. , 0. , 0. , 5. , 6. ])
2. 索引为数组
如果索引表达式包含逗号分隔的数组,则将它们沿第一个轴堆叠。
np.r_[np.array([1,2,3]), 0, 0, np.array([4,5,6])]
# array([1, 2, 3, 0, 0, 4, 5, 6])
3. 字符串参数
可以用字符串作为索引的第一个参数来改变输出:
(1) 三个由逗号分隔的整数
第一个整数axis指定在哪个轴上连接,默认为 '0' 。
a = np.array([[0, 1, 2], [3, 4, 5]])
np.r_['0', a, a]
# array([[0, 1, 2],
# [3, 4, 5],
# [0, 1, 2],
# [3, 4, 5]])
np.r_['1', a, a]
# array([[0, 1, 2, 0, 1, 2],
# [3, 4, 5, 3, 4, 5]])
第二个整数ndmin指定每个数组在连接前必须具有的最小维数。如果原数组的维度不足,则会自动添加长度为1的新轴直到维度为ndmin,默认为 '1' 。
np.r_['0,2', [1,2,3], [4,5,6]]
# array([[1, 2, 3],
# [4, 5, 6]])
第三个整数trans1d指定当数组在升维时原数组应该按顺序铺在哪个维度上,默认为 '-1' 。
np.r_['0,2,0', [1,2,3], [4,5,6]]
# array([[1],
# [2],
# [3],
# [4],
# [5],
# [6]])
# 解释:原数组是一维的(3,),由于ndmin=2所以需要升维,在升维时trans1d=0所以原数组被铺在了维度0上,
# 变成了(3,1),axis=0所以两个数组在维度0上连接,输出结果的维度为(6,1)。np.r_['0,2,1', [1,2,3], [4,5,6]]
# array([[1, 2, 3],
# [4, 5, 6]])
# 解释:在升维时trans1d=1所以原数组被铺在了维度1上,变成了(1,3),垂直堆砌后输出结果的维度为(2,3)。np.r_['1,2,0', [1,2,3], [4,5,6]]
# array([[1, 4],
# [2, 5],
# [3, 6]])
# 解释:在升维时原数组被铺在了维度0上,变成了(3,1),水平堆砌后输出结果的维度为(3,2)。np.r_['1,2,1', [1,2,3], [4,5,6]]
# array([[1, 2, 3, 4, 5, 6]])
# 解释:在升维时原数组被铺在了维度1上,变成了(1,3),水平堆砌后输出结果的维度为(1,6)。
(2) 字符串 'r' 或 'c'
输出matrix对象。
如果结果是一维且指定了 'r' ,则生成一个 1 x N(行)矩阵。
如果结果是一维且指定了 'c' ,则生成一个 N x 1(列)矩阵。
如果结果是二维,则 'r' 和 'c' 结果相同。
np.r_['r',[1,2,3], [4,5,6]] # matrix([[1, 2, 3, 4, 5, 6]])
numpy.c_
将切片或对象沿最后一个轴连接,相当于:
np.r_['-1,2,0', index expression]
比如,下面的输出与上面 np.r_['1,2,0', [1,2,3], [4,5,6]] 的输出相同:
np.c_[np.array([1,2,3]), np.array([4,5,6])]
# array([[1, 4],
# [2, 5],
# [3, 6]])
numpy.s_
生成一个由切片符号表示的slice对象,语法:
np.s_[start:stop:step]
相当于生成了一个范围为 np.arange(start, stop, step) 的切片。
np.array([0, 1, 2, 3, 4])[np.s_[2::2]] # array([2, 4])
np.array([0, 1, 2, 3, 4])[np.arange(2,5,2)] # array([2, 4])
numpy中切片的类型为IndexExpression,但相较于直接使用它,更应该用这两个预定义的实例:
np.s_:IndexExpression(maketuple=False)
np.index_exp:IndexExpression(maketuple=True)
两者的区别在于np.index_exp总是会返回一个元组。
np.s_[2::2] # slice(2, None, 2)
np.index_exp[2::2] # (slice(2, None, 2),)