np.newaxis增加array維度
a[:, np.newaxis]
# 給a最外層中括號中的每一個元素加[]
a[np.newaxis, :]
# 給a最外層中括號中所有元素加[]
對一維數(shù)組有:
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]
, 但只能用于一維數(shù)組:
參考 https://www.jb51.net/article/144967.htm
numpy.concatenate() 數(shù)組拼接
方法1: 使用list的extend()
首先將數(shù)組轉(zhuǎn)成列表觉渴,然后利用列表的拼接函數(shù)append()沐鼠、extend()等進(jìn)行拼接處理崔兴,最后將列表轉(zhuǎn)成數(shù)組匀奏。該方法只適用于簡單的一維數(shù)組拼接,由于轉(zhuǎn)換過程很耗時間门驾,對于大量數(shù)據(jù)的拼接一般不建議使用射赛。
方法二: 使用numpy.append()
numpy直接提供了numpy.append(arr, values, axis=None)函數(shù)。對于參數(shù)規(guī)定奶是,要么一個數(shù)組和一個數(shù)值楣责;要么兩個數(shù)組,不能三個及以上數(shù)組直接append拼接聂沙。
注意: numpy的數(shù)組沒有動態(tài)改變大小的功能秆麸,numpy.append()函數(shù)每次都會重新分配整個數(shù)組,并把原來的數(shù)組復(fù)制到新數(shù)組中及汉。
方法三: 使用numpy.concatenate()
numpy提供了numpy.concatenate((a1,a2,...), axis=0)函數(shù)沮趣。能夠一次完成多個數(shù)組的拼接。其中a1,a2,...是數(shù)組類型的參數(shù)坷随。concatenate()效率比append()高房铭,適合大規(guī)模的數(shù)據(jù)拼接。
np.concatenate((a,b),axis=1) #axis=1表示對應(yīng)行的數(shù)組進(jìn)行拼接
默認(rèn)情況下温眉,axis=0可以不寫缸匪。對于一維數(shù)組拼接,axis的值不影響最后的結(jié)果类溢。
參考 https://blog.csdn.net/qq_38150441/article/details/80488800
numpy.random.RandomState()
可以通過numpy工具包生成模擬數(shù)據(jù)集凌蔬,使用RandomState獲得隨機(jī)數(shù)生成器
from numpy.random import RandomState
rdm = RandomState(1)
注意:這里1為隨機(jī)數(shù)種子,只要隨機(jī)數(shù)種子seed相同闯冷,產(chǎn)生的隨機(jī)數(shù)系列就相同
均勻分布:
a = rdm.uniform(1,2,(3,4))
print(a)
輸出結(jié)果為:
[[1.417022 1.72032449 1.00011437 1.30233257]
[1.14675589 1.09233859 1.18626021 1.34556073]
[1.39676747 1.53881673 1.41919451 1.6852195 ]]
產(chǎn)生一個3行4列的數(shù)組砂心,其中每個元素都是在[1,2]區(qū)間內(nèi)均勻分布的隨機(jī)數(shù)
[0, 1)之間的隨機(jī)分布:
b = rdm.rand(1,2)
print(b)
輸出為:
[[0.417022 0.72032449]]
注意:這里的rand()里面的值若為0,就表示會隨機(jī)產(chǎn)生一個[0,1)之間的隨機(jī)數(shù)蛇耀,并不是一個一維數(shù)組计贰,且0可以包括,1不包含蒂窒。當(dāng)rand()里面數(shù)為1時躁倒,產(chǎn)生一個一維的一個數(shù)字?jǐn)?shù)組。rand(2)返回一個一維的2個數(shù)字?jǐn)?shù)組.
- np.random.rand(): 同rdm.rand(), rand()返回一個數(shù)字, rand(1)返回一個一維的1個數(shù)字?jǐn)?shù)組, rand(2)返回一個一維的2個數(shù)字?jǐn)?shù)組, 要注意區(qū)分.
- np.random.randn(): 同上, 只是服從正態(tài)分布
- numpy.random.randint(low, high=None, size=None, dtype=’l’): 通過low來指定起點洒琢,通過high來指定終點秧秉,通過size參數(shù)來指定數(shù)組的維度,通過dtype來確定類型衰抑。范圍包括low不包括high, 當(dāng)high未指定時范圍為[0, low), 默認(rèn)數(shù)據(jù)類型為np.int.
- np.random.random(size=None): 生成[0, 1)之間的浮點數(shù),
np.hstack(), np.vstack()
np.hstack()
按水平方向堆疊成一個新的數(shù)組, 即把所有行放入到一個數(shù)組中, 由(150,2)變成(300,), np.vstack()
按豎直方向. 該操作目的本質(zhì)上就是把list變成ndarray, 因為list無list[:, 0]
這種切片操作. 且list[0]
返回的是一維列表, list[0:1]
返回的是二維列表, 雖然內(nèi)容相同
data = np.hstack(data).reshape(-1, 2) # reshape中-1可以自動根據(jù)其他的參數(shù)計算出-1處需要的參數(shù)
label = np.hstack(label).reshape(-1, 1)
np.meshgrid()
也叫np.mgrid(), 當(dāng)傳入兩個一維數(shù)組時, np.meshgrid(x, y)先以x為每一行, 共len(y)行組成二維數(shù)組; 再以y的轉(zhuǎn)置為每一列, 共len(x)列組成二維數(shù)組, 最后返回兩個形狀相同的二維數(shù)組組成的列表.
注: numpy中一維數(shù)組均為列向量, 實質(zhì)上是x的轉(zhuǎn)置成為每一行, 只不過這里為了方便觀察反過來了
若兩個參數(shù)均為多維數(shù)組, 則np.meshgrid()返回的第一個數(shù)組為len(y)行, 每一行相當(dāng)于做了一個x.ravel()或np.hstack(x); 第二個數(shù)組為len(x)列, 每一列相當(dāng)于y.ravel()的轉(zhuǎn)置.
其中x.ravel()將所有元素匯總成同一行, 相當(dāng)于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_[]必須使用方括號傳入數(shù)組
- np.r_[]是按列連接兩個矩陣象迎,就是把兩矩陣上下相加,要求列數(shù)相等呛踊。相當(dāng)于
np.concatenate([xx, yy], axis=0)
或者np.row_stack([xx, yy])
當(dāng)輸入為一維數(shù)組時視為2個列向量縱向拼接 - np.c_[]是按行連接兩個矩陣砾淌,就是把兩矩陣左右相加,要求行數(shù)相等谭网。相當(dāng)于
np.concatenate([xx, yy], axis=1)
或者np.column_stack([xx, yy])
當(dāng)輸入為一維數(shù)組時視為2個列向量橫向拼接
在numpy中汪厨,一個一維數(shù)組雖然是橫著表示的,但它是列向量愉择。
np.repeat()和np.tile()
主要用于對齊Proposal和RoI以逐一進(jìn)行比較, tf中沒有repeat()函數(shù), 使用tf.tile()和tf.reshape()達(dá)到同樣效果
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]的位置