np.newaxis增加array维度
a[:, np.newaxis]
# 给a最外层中括号中的每一个元素加[]
a[np.newaxis, :]
# 给a最外层中括号中所有元素加[]
对一维数组有:
x = np.random.randint(1, 8, size=5)
Out[1]: array([4, 6, 6, 6, 5])
x1 = x[np.newaxis, :]
Out[2]: array([[4, 6, 6, 6, 5]])
x2 = x[:, np.newaxis]
Out[3]:
array([[4],
[6],
[6],
[6],
[5]])
若不使用numpy也可以concat = concat[None]
, 但只能用于一维数组:
参考 https://www.jb51.net/article/144967.htm
numpy.concatenate() 数组拼接
方法1: 使用list的extend()
首先将数组转成列表,然后利用列表的拼接函数append()、extend()等进行拼接处理,最后将列表转成数组。该方法只适用于简单的一维数组拼接,由于转换过程很耗时间,对于大量数据的拼接一般不建议使用。
方法二: 使用numpy.append()
numpy直接提供了numpy.append(arr, values, axis=None)函数。对于参数规定,要么一个数组和一个数值;要么两个数组,不能三个及以上数组直接append拼接。
注意: numpy的数组没有动态改变大小的功能,numpy.append()函数每次都会重新分配整个数组,并把原来的数组复制到新数组中。
方法三: 使用numpy.concatenate()
numpy提供了numpy.concatenate((a1,a2,...), axis=0)函数。能够一次完成多个数组的拼接。其中a1,a2,...是数组类型的参数。concatenate()效率比append()高,适合大规模的数据拼接。
np.concatenate((a,b),axis=1) #axis=1表示对应行的数组进行拼接
默认情况下,axis=0可以不写。对于一维数组拼接,axis的值不影响最后的结果。
参考 https://blog.csdn.net/qq_38150441/article/details/80488800
numpy.random.RandomState()
可以通过numpy工具包生成模拟数据集,使用RandomState获得随机数生成器
from numpy.random import RandomState
rdm = RandomState(1)
注意:这里1为随机数种子,只要随机数种子seed相同,产生的随机数系列就相同
均匀分布:
a = rdm.uniform(1,2,(3,4))
print(a)
输出结果为:
[[1.417022 1.72032449 1.00011437 1.30233257]
[1.14675589 1.09233859 1.18626021 1.34556073]
[1.39676747 1.53881673 1.41919451 1.6852195 ]]
产生一个3行4列的数组,其中每个元素都是在[1,2]区间内均匀分布的随机数
[0, 1)之间的随机分布:
b = rdm.rand(1,2)
print(b)
输出为:
[[0.417022 0.72032449]]
注意:这里的rand()里面的值若为0,就表示会随机产生一个[0,1)之间的随机数,并不是一个一维数组,且0可以包括,1不包含。当rand()里面数为1时,产生一个一维的一个数字数组。rand(2)返回一个一维的2个数字数组.
- np.random.rand(): 同rdm.rand(), rand()返回一个数字, rand(1)返回一个一维的1个数字数组, rand(2)返回一个一维的2个数字数组, 要注意区分.
- np.random.randn(): 同上, 只是服从正态分布
- numpy.random.randint(low, high=None, size=None, dtype=’l’): 通过low来指定起点,通过high来指定终点,通过size参数来指定数组的维度,通过dtype来确定类型。范围包括low不包括high, 当high未指定时范围为[0, low), 默认数据类型为np.int.
- np.random.random(size=None): 生成[0, 1)之间的浮点数,
np.hstack(), np.vstack()
np.hstack()
按水平方向堆叠成一个新的数组, 即把所有行放入到一个数组中, 由(150,2)变成(300,), np.vstack()
按竖直方向. 该操作目的本质上就是把list变成ndarray, 因为list无list[:, 0]
这种切片操作. 且list[0]
返回的是一维列表, list[0:1]
返回的是二维列表, 虽然内容相同
data = np.hstack(data).reshape(-1, 2) # reshape中-1可以自动根据其他的参数计算出-1处需要的参数
label = np.hstack(label).reshape(-1, 1)
np.meshgrid()
也叫np.mgrid(), 当传入两个一维数组时, np.meshgrid(x, y)先以x为每一行, 共len(y)行组成二维数组; 再以y的转置为每一列, 共len(x)列组成二维数组, 最后返回两个形状相同的二维数组组成的列表.
注: numpy中一维数组均为列向量, 实质上是x的转置成为每一行, 只不过这里为了方便观察反过来了
若两个参数均为多维数组, 则np.meshgrid()返回的第一个数组为len(y)行, 每一行相当于做了一个x.ravel()或np.hstack(x); 第二个数组为len(x)列, 每一列相当于y.ravel()的转置.
其中x.ravel()将所有元素汇总成同一行, 相当于np.hstack(x)
x = np.array([[0, 1, 2, 3], [4, 5, 6, 7]])
y = np.array([[11, 12, 13], [14, 15, 16]])
np.meshgrid(x, y)
OUT:
[array([[0, 1, 2, 3, 4, 5, 6, 7],
[0, 1, 2, 3, 4, 5, 6, 7],
[0, 1, 2, 3, 4, 5, 6, 7],
[0, 1, 2, 3, 4, 5, 6, 7],
[0, 1, 2, 3, 4, 5, 6, 7],
[0, 1, 2, 3, 4, 5, 6, 7]]), array([[11, 11, 11, 11, 11, 11, 11, 11],
[12, 12, 12, 12, 12, 12, 12, 12],
[13, 13, 13, 13, 13, 13, 13, 13],
[14, 14, 14, 14, 14, 14, 14, 14],
[15, 15, 15, 15, 15, 15, 15, 15],
[16, 16, 16, 16, 16, 16, 16, 16]])]
np.c_[], np.r_[]
np.c_[], np.r_[]必须使用方括号传入数组
- np.r_[]是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等。相当于
np.concatenate([xx, yy], axis=0)
或者np.row_stack([xx, yy])
当输入为一维数组时视为2个列向量纵向拼接 - np.c_[]是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等。相当于
np.concatenate([xx, yy], axis=1)
或者np.column_stack([xx, yy])
当输入为一维数组时视为2个列向量横向拼接
在numpy中,一个一维数组虽然是横着表示的,但它是列向量。
np.repeat()和np.tile()
主要用于对齐Proposal和RoI以逐一进行比较, tf中没有repeat()函数, 使用tf.tile()和tf.reshape()达到同样效果
boxes1 = [[0,0,3,3], [1,1,5,5], [9,9,11,11]]
boxes2 = [[0,0,2,2], [1,1,3,3], [4,4,6,6], [6,6,9,9], [11,11,13,13]]
b1 = np.repeat(boxes1, np.shape(boxes2)[0], axis=0)
b2 = np.tile(boxes2, [np.shape(boxes1)[0], 1])
with tf.Session() as sess:
print(sess.run(b1, b2))
输出为
[[ 0 0 3 3]
[ 0 0 3 3]
[ 0 0 3 3]
[ 0 0 3 3]
[ 0 0 3 3]
[ 1 1 5 5]
[ 1 1 5 5]
[ 1 1 5 5]
[ 1 1 5 5]
[ 1 1 5 5]
[ 9 9 11 11]
[ 9 9 11 11]
[ 9 9 11 11]
[ 9 9 11 11]
[ 9 9 11 11]]
[[ 0 0 2 2]
[ 1 1 3 3]
[ 4 4 6 6]
[ 6 6 9 9]
[11 11 13 13]
[ 0 0 2 2]
[ 1 1 3 3]
[ 4 4 6 6]
[ 6 6 9 9]
[11 11 13 13]
[ 0 0 2 2]
[ 1 1 3 3]
[ 4 4 6 6]
[ 6 6 9 9]
[11 11 13 13]]
np.argmax()
axis=0返回每一列最大值的位置, axis=1返回每一行最大值的位置
test = np.array([[1, 2, 3], [2, 3, 4], [5, 4, 3], [8, 7, 2]])
np.argmax(test, 0) #输出:array([3, 3, 1]), 即[8, 7, 4]的位置
np.argmax(test, 1) #输出:array([2, 2, 0, 0]), 即[3, 4, 5, 8]的位置