.concatenate

常用方法

把两个array拼接在一起,拼接的时候可以选择轴。

numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
# 去掉第1个维度,第2个维度首尾依次相连,得到新的数据
>>> np.concatenate([[1,2,3],[4,5,6]])
array([1, 2, 3, 4, 5, 6])

轴的含义如下列代码所示:

>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
[3, 4],
[5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
[3, 4, 6]])
>>> np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])

重新排列数据,并且改变数组维度和每一个维度的长度,(如果看做张量,则是张量的阶数和维度),如下列代码所示:

# 将长度为12的1维数组,改变为2维数组,长度分别为3和4
>>> np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]).reshape(3,4)
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
# 将长度为12的1维数组,改变为2维数组,长度分别为4x3
>>> np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]).reshape(4,3)
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
# 将长度为12的1维数组,改变为2维数组,第一个维度长度为3,第二个维度长度自动计算,(结果是4)
>>> np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]).reshape(3,-1)
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
# 将长度为12的1维数组,改变为3维数组,每个维度的长度分别为3x2x2
>>> np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]).reshape(3,2,2)
array([[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9, 10],
[11, 12]]])
# 尝试将长度为12的1维数组,改变为2维数组,每个维度的长度为3x3,会发生错误。
>>> np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]).reshape(3,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: cannot reshape array of size 12 into shape (3,3)

"a[x:y,z]"操作符

numpy的array引入了“:”和“,”操作符,“a[x:y,z]”代表的含义是取编号为z的分量,组成新的数组,相较于原来的array,维度降低了1。

参考如下示例:

>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
#把第1列的元素重新组织,成一个新的array
>>> a[:,1]
array([2, 5, 8])
#把第1列的元素重新组织,但是只取index为[0,2)区间的元素,注意是开区间。
>>> a[0:2,1]
array([2, 5])
>>>

下面是一个稍微深入的例子

>>> a = np.array([[0,1,2],[0,4,5],[1,7,8],[1,9,10]])
>>> a
array([[ 0, 1, 2],
[ 0, 4, 5],
[ 1, 7, 8],
[ 1, 9, 10]])
# 取第一列所有元素,组成新的数组
>>> b = a[:,0]
>>> b
# 数组的==操作符,返回的仍然是数组,数组由bool类型数据组成,表示每一个元素==的结果。
array([0, 0, 1, 1])
>>> c = (b==0)
>>> c
array([ True, True, False, False])
# 一个由bool类型组成的数组,同样可以作为“[:,]”操作符的range,理解为mask,True的元素对应提提取出来。
# 取a中第一列元素,组成新数组,在新数组中寻找值为0的元素,得到一个[0,2)的范围,然后a基于这个范围,再重组最后一列元素。
>>> a[c,-1]
array([2, 5])
# 取a中第一列元素,组成新数组,在新数组中寻找值为0的元素,得到一个[0,2)的范围,然后a基于这个范围,再重组[1,3)列元素,整体的维度不会改变。
>>> a[c,1:3]
array([[1, 2],
[4, 5]])
>>>
# 取a中第一列元素,组成新数组,在新数组中寻找值为1的元素,得到一个[2,4)的范围,然后a基于这个范围,再重组最后一列元素。
>>> d = (b==1)
>>> d
array([False, False, True, True])
>>> a[d,-1]
array([ 8, 10])
>>>