Python Numpy使用

Python的第三方擴(kuò)展庫(kù)趾徽,是其他數(shù)據(jù)分析模塊的基礎(chǔ)朽缎,主要用于數(shù)組惨远、矩陣計(jì)算(比列表快得多)等方面

安裝

pip install numpy

常用方法

array()

創(chuàng)建數(shù)組,舉例:
創(chuàng)建一維數(shù)組:numpy.array([x,y,...])
二維數(shù)組:numpy.array([[x,y...],[x,y...],[x,y...])
注:
創(chuàng)建的數(shù)組如果想看格式(幾行幾列)话肖,就通過(guò)array.shape來(lái)看就行了北秽,要知道是幾維的數(shù)據(jù),可以通過(guò)array.ndim查看最筒,舉例:

>>> z = np.array([[1,2],[3,4],[5,6]])
>>> z.ndim
2
#2維
>>> z.shape
(3, 2)
#3行兩列
>>> m = np.array([1,2])
>>> m.shape
(2,)
#1行兩列

注2:
數(shù)組創(chuàng)建后大小就固定了贺氓,所以如果想要進(jìn)行增刪改查則可以參考如下方法:

  • 增:使用tile()擴(kuò)展、vstack()合并床蜘、轉(zhuǎn)成列表操作再轉(zhuǎn)回來(lái)(參考后面)
  • 刪:可以直接像a=a[0]辙培,那么就只有一行了、分片操作
  • 改:直接改
  • 查:直接查邢锯,可以參考后面的數(shù)組切片
    舉例:
>>> a = np.array([1,2,3,4])
>>> np.tile(a, 2)  #此時(shí)第二個(gè)參數(shù)相當(dāng)于(1,2)扬蕊,即擴(kuò)展成1行2列(x軸變成原來(lái)2倍)
array([1, 2, 3, 4, 1, 2, 3, 4])
數(shù)組操作

對(duì)數(shù)組的操作都是通過(guò)依次對(duì)其中的元素進(jìn)行相同操作,舉例:

>>> x = np.array([-1,0,1,2,3])
>>> x
array([-1,  0,  1,  2,  3])
>>> x > 1  #依次判斷丹擎,若滿足條件則True尾抑,否則False
array([False, False, False,  True,  True])
>>> x * 2  #依次對(duì)所有元素乘2
array([-2,  0,  2,  4,  6])
>>> x = np.array([[1,2],[3,4]])
>>> x[x>2] = 0
# 將數(shù)組中大于2的值都置0
>>> x
array([[1, 2],
       [0, 0]])
>>> x = np.arange(0, 5)
>>> x
array([0, 1, 2, 3, 4])
>>> y = x[:, np.newaxis]
# 把x轉(zhuǎn)成二維就是y
>>> y
array([[0],
       [1],
       [2],
       [3],
       [4]])
>>> x + y
# 對(duì)于兩個(gè)不是相同格式的數(shù)據(jù)添加,會(huì)自動(dòng)拓展成兩個(gè)都合適的維度進(jìn)行計(jì)算蒂培,后面會(huì)還原計(jì)算過(guò)程
array([[0, 1, 2, 3, 4],
       [1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6],
       [3, 4, 5, 6, 7],
       [4, 5, 6, 7, 8]])
>>> x1 = np.tile(x, (5, 1))
# 把x的行復(fù)制成原來(lái)的5倍
>>> x1
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])
>>> y1 = np.tile(y, (1, 5))
# 把y的列復(fù)制成原來(lái)的5倍
>>> y1
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3],
       [4, 4, 4, 4, 4]])
>>> x1 + y1
# 可以看到結(jié)果和之前是一樣的
array([[0, 1, 2, 3, 4],
       [1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6],
       [3, 4, 5, 6, 7],
       [4, 5, 6, 7, 8]])

注:
數(shù)組是可以定義里面所有的類型統(tǒng)一的(通過(guò)astype方法或者有些數(shù)據(jù)讀取自帶類型再愈,比如圖片讀取默認(rèn)是np.uint8),所以在對(duì)數(shù)組進(jìn)行操作前需要判斷數(shù)據(jù)類型是否符合要求或者需要轉(zhuǎn)型护戳,否則將可能發(fā)生數(shù)據(jù)被自動(dòng)轉(zhuǎn)型或者操作失敗等問(wèn)題翎冲,舉例:

>>> x = np.array([[-1,0,1], [2,3,4]], np.int8)
# 數(shù)據(jù)類型是int8:-256~255
>>> x[1, :] = [1., 2., 300.]
>>> x
array([[-1,  0,  1],
       [ 1,  2, 44]], dtype=int8)
# 300超過(guò)邊界,被自動(dòng)轉(zhuǎn)成44(300-255媳荒,從0開(kāi)始)
數(shù)組索引

數(shù)組除了可以通過(guò)輸入對(duì)應(yīng)行列或者切片(后面會(huì)介紹)進(jìn)行索引以外抗悍,也可以輸入一個(gè)列表進(jìn)行批量指定索引,舉例:

>>> x = np.array([-1,0,1,2,3])
>>> x[[1,2,4]]
# 索引第2,3,5個(gè)數(shù)據(jù)
array([0, 1, 3])

注:
輸入列表是批量索引肺樟,但輸入的如果是元組檐春,則是指定坐標(biāo)索引逻淌,舉例:

>>> x = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> x
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> x[[0,1]]
# 輸入列表么伯,代表要第一行和第二行
array([[1, 2, 3],
       [4, 5, 6]])
>>> x[(0,1)]
# 輸入元組,代表要第一行第二列的數(shù)據(jù)
2
>>> x[(0,1), (1,1)]
# 要坐標(biāo)為0,1和1,1的數(shù)據(jù)
array([2, 5])
>>> x[(0,1,1)]
# 用元組默認(rèn)是當(dāng)成一組坐標(biāo)卡儒,因此必須是2個(gè)值成對(duì)出現(xiàn)田柔,這里輸入3個(gè)俐巴,而數(shù)據(jù)是二維,自然就報(bào)錯(cuò)了
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    x[(0,1,1)]
IndexError: too many indices for array
邏輯操作

從前面的代碼可以知道數(shù)組可以進(jìn)行整體的邏輯判斷硬爆,但是前面的示例都是單個(gè)條件判斷欣舵,如果想進(jìn)行多個(gè)判斷后再進(jìn)行與或異或這些操作,可以使用logical_and()等這類邏輯操作方法缀磕,舉例:

>>> a = np.array([[1,2,3], [1,2,""], [1,2,None]])
>>> np.logical_and.reduce([a!="", a!=None])
array([[ True,  True,  True],
       [ True,  True, False],
       [ True,  True, False]])
# 同時(shí)判斷值不為空字符串和None

上面的方法只能對(duì)兩個(gè)條件進(jìn)行判斷缘圈,多個(gè)條件的情況參考:
http://www.reibang.com/p/1146b51ae6de

sort()

排序,正常排袜蚕,遇到無(wú)法排序的放最后糟把,舉例:

>>> x = np.array([1,3,2,'a',5])
>>> x
array(['1', '3', '2', 'a', '5'], dtype='<U11')  #排序前
>>> x.sort()
>>> x
array(['1', '2', '3', '5', 'a'], dtype='<U11')  #排序后

注:
二維數(shù)組排序只排每一行里面的,其他行之間互不干擾

max()

求最大值牲剃,如果在二維數(shù)組中遣疯,每行的列數(shù)相等,那么最大值就是所有元素里最大的凿傅,舉例:

>>> x = np.array([[1,2,3,5],[1,2,0,0],[5,8,23,1]])
>>> x.max()
23

但如果每行列數(shù)不同缠犀,返回的就是數(shù)開(kāi)頭最大的那一行(假如第一個(gè)一樣,再比第二個(gè)...)聪舒,舉例:

>>> x = np.array([[3,2,1,4,10],[1,2,0,0],[3,6,9,1]])
>>> x.max()
[3, 6, 9, 1]

注:
最小值min()辨液,平均值是mean(),加權(quán)平均值是average()过椎,標(biāo)準(zhǔn)差是std()

[:]

數(shù)組切片室梅,參考列表,舉例:

>>> b = np.array([1,2,3,4,5])
>>> b[1:3]
array([2, 3])
>>> a = np.array(([1,2,3,4],[5,6,7,8],[9,10,11,12]))
>>> a[1:]
array([[ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
>>> a[:][1]  #切出所有行疚宇,取第2個(gè)
array([5, 6, 7, 8])
>>> a[:][1:]    #切出所有行亡鼠,取第二個(gè)2到最后一個(gè)
array([[ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

可以看出上面只能切出行而不能切分列(其將行看作整體來(lái)切分),所以推薦使用下面的針對(duì)數(shù)組特殊的切片方法來(lái)切分行列敷待,格式:[:,:]间涵,在一個(gè)括號(hào)里寫(xiě)分片,逗號(hào)分隔行列榜揖,舉例:

>>> a = np.array(([1,2,3,4],[5,6,7,8],[9,10,11,12]))
>>> a[1:, 1]  #取第二勾哩、三行的第二列數(shù)據(jù)
array([ 6, 10])
>>> a[:, 0:3]  #取所有行的第一列到第三列數(shù)據(jù)
array([[ 1,  2,  3],
       [ 5,  6,  7],
       [ 9, 10, 11]])
...

省略號(hào)在數(shù)組當(dāng)中也是可以使用的,也是切片的一種举哟,但有所不同思劳,舉例:

>>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> x.shape
(2, 3, 1)
>>> x[...,0]
array([[1, 2, 3],
       [4, 5, 6]])
>>> x[:,0]
# 發(fā)現(xiàn)和x[...,0]結(jié)果不一樣
array([[1],
       [4]])
>>> x[:,:,0]
# 和x[...,0]結(jié)果一樣
array([[1, 2, 3],
       [4, 5, 6]])

從上面可以看出...的切片效果就是將所有...以外沒(méi)設(shè)置范圍的地方都調(diào)整為:

random.randint(x,y,n)

隨機(jī)數(shù)整數(shù)生成,前兩個(gè)參數(shù)代表范圍妨猩,第三個(gè)為可選潜叛,表示生成格式或者數(shù)量,比如:

>>> np.random.randint(1,10,10)
# 隨機(jī)生成10個(gè)1到10的隨機(jī)數(shù)
array([ 6,  5,  7,  6,  5,  4,  9,  9, 10,  5])
>>> np.random.randint(0, 256, (100, 80))
# 隨機(jī)生成格式為100行80列的數(shù)組
array([[ 46, 100,  98, ...,  56,  97, 172],
       [ 60, 141, 217, ..., 208, 157,  70],
       [189, 200,  13, ..., 193,  95,  80],
       ...,
       [ 88, 155, 253, ..., 183, 139, 182],
       [ 24, 101, 117, ..., 103,  30,  77],
       [ 88, 236,  35, ...,  47, 211, 189]])

上面那個(gè)是生成整數(shù)的隨機(jī)數(shù),還有rand()用來(lái)生成0到1之間的隨機(jī)數(shù)威兜,中間可以加參數(shù)代表生成幾個(gè)销斟,舉例:

>>> np.random.rand(10)  #生成10個(gè)0-1的隨機(jī)數(shù)
array([0.42462596, 0.0985224 , 0.22108224, 0.46230285, 0.40928969,
       0.54201574, 0.88982411, 0.8450716 , 0.21384846, 0.38896833])
random.random.normal(μ,σ,n)

生成一堆符合正態(tài)分布的數(shù),第一個(gè)參數(shù)是均值椒舵,第二個(gè)參數(shù)是標(biāo)準(zhǔn)差蚂踊,第三個(gè)參數(shù)是生成數(shù),舉例:

>>> a = np.random.normal(0,1,10)
>>> a
array([-0.55491277, -1.1161704 ,  0.97514814,  1.99653332, -0.08500584,
        0.64075696,  1.96409159, -0.11636198,  0.52605946,  0.90563603])
>>> a.mean()
0.513577451404013
>>> a.std()
0.9612030098851562
#當(dāng)生成的數(shù)多了笔宿,精度自然也會(huì)提高

更多numpy.random參考:
http://www.mamicode.com/info-detail-507676.html

arange()

類似range犁钟,前兩個(gè)參數(shù)代表范圍,第三個(gè)代表階值類似range泼橘,舉例:

>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(1,10,2)
array([1, 3, 5, 7, 9])

注:
發(fā)現(xiàn)了嗎特纤,像python自帶的randomrange雖然和這些幾乎一樣侥加,但有個(gè)區(qū)別就是numpy下的這幾個(gè)方法生成的都是array類型的捧存,原來(lái)那些都是list類型

concatenate()

將數(shù)組整合在一起,數(shù)組不像列表那樣可以直接加著整合担败,比如列表里:

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a+b
[1, 2, 3, 4, 5, 6]
>>> a*2
[1, 2, 3, 1, 2, 3]

從上面可以看出對(duì)列表進(jìn)行運(yùn)算都是把列表當(dāng)成整體來(lái)運(yùn)算昔穴,而對(duì)于數(shù)組里:

>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> a + b
array([5, 7, 9])
>>> a * 2
array([2, 4, 6])

可以看出對(duì)數(shù)組的運(yùn)算是對(duì)他里面的值進(jìn)行運(yùn)算,因此要對(duì)數(shù)組進(jìn)行列表那樣的操作提前,就需要用上面那個(gè)方法吗货,對(duì)上面的a、b舉例:

>>> np.concatenate((a, b))  #以元組形式傳入
array([1, 2, 3, 4, 5, 6])
sum()

計(jì)算總和狈网,舉例:

>>> np.sum([1,2,3])
6

上面的是對(duì)行內(nèi)相加宙搬,如果是多行數(shù)據(jù),并且希望是各行的對(duì)應(yīng)數(shù)據(jù)之間相加拓哺,可以設(shè)置參數(shù):axis=0(默認(rèn)為1勇垛,即行內(nèi)相加),舉例:

>>> a = np.array([[1,2,3,4], [5,6,7,8], [1, 2, 3, 4]])
>>> a.sum()  #全部數(shù)據(jù)之和
46
>>> a.sum(axis=0)  #各行對(duì)應(yīng)數(shù)據(jù)之和
array([ 7, 10, 13, 16])

注:
其他計(jì)算操作如:求對(duì)數(shù)用np.log()士鸥,向上取整用np.ceil()闲孤,比如3.1就變成4

unique()

去重,舉例:

>>> np.unique([1,2,3,1,2,3,5,6,4])
array([1, 2, 3, 4, 5, 6])
>>> np.unique(np.array([1,2,3,1,2,3,5,6,4]))  #對(duì)數(shù)組烤礁、列表都可以讼积,但最終都是變成數(shù)組
array([1, 2, 3, 4, 5, 6])
drop()

丟棄

fillna()

對(duì)丟失值的填充

tile()

復(fù)制擴(kuò)展數(shù)組,有兩個(gè)參數(shù)脚仔,第一個(gè)是要復(fù)制擴(kuò)展的數(shù)組勤众,第二個(gè)參數(shù)是個(gè)元組,意思是變成幾行幾列鲤脏,舉例:

>>> a = np.array([1,2,3,4])
>>> np.tile(a, 2)  #此時(shí)第二個(gè)參數(shù)相當(dāng)于(1,2)们颜,即擴(kuò)展成1行2列(x軸變成原來(lái)2倍)
array([1, 2, 3, 4, 1, 2, 3, 4])

第二個(gè)參數(shù)的元組有幾位,就代表幾維,一般都是用二維掌桩,即兩個(gè)值,代表幾行幾列姑食,在列上擴(kuò)展舉例1:

>>> np.tile(a, (2, 1))  #擴(kuò)展成2行1列
array([[1, 2, 3, 4],
       [1, 2, 3, 4]])

其還能擴(kuò)展到更多維波岛,如三維舉例:

>>> np.tile(a, (3, 2, 1))  #在三維下,分3組音半,每組2行1列
array([[[1, 2, 3, 4],
        [1, 2, 3, 4]],

       [[1, 2, 3, 4],
        [1, 2, 3, 4]],

       [[1, 2, 3, 4],
        [1, 2, 3, 4]]])

四維舉例:

>>> np.tile(a, (2, 3, 3, 2))    #在4維下则拷,分2組,每組3個(gè)曹鸠,每個(gè)3行2列
array([[[[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]],

        [[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]],

        [[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]]],


       [[[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]],

        [[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]],

        [[1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4],
         [1, 2, 3, 4, 1, 2, 3, 4]]]])

發(fā)現(xiàn)了嗎煌茬,可以這樣理解第二個(gè)參數(shù),那就是元組的最后兩個(gè)數(shù)代表變成原來(lái)的幾行幾列彻桃,前面的數(shù)都是分多少組多少個(gè)坛善,比如三維的3個(gè)數(shù)分別代表:幾組幾行幾列;四維分別代表:幾組幾個(gè)幾行幾列邻眷;五維:幾組幾個(gè)幾塊幾行幾列眠屎;六…(單位是瞎編的,但是意思沒(méi)錯(cuò))

zero()

生成一個(gè)自定義大小值全為0的數(shù)組肆饶,傳入?yún)?shù)是一個(gè)列表或元組改衩,代表幾行幾列,舉例:

>>> np.zeros([2,5])
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

其傳入的列表也可以是多維的驯镊,比如:

>>> np.zeros([2,2,5])  #2組葫督,每組2行5列
array([[[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]],

       [[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]]])

多維的用法和tile()函數(shù)的基本一樣,參考上面即可
注:
numpy里還有生成一個(gè)自定義大小值全為1的數(shù)組放方法:ones()板惑,還有值都為空的數(shù)組:empty()

vstack()/hstack()

將兩個(gè)數(shù)組在垂直/水平方向合并橄镜,舉例:

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

注:
如果是對(duì)當(dāng)前數(shù)組自己進(jìn)行垂直/水平方向合并,則相當(dāng)于轉(zhuǎn)成二維或者一維冯乘,舉例:

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

也是把數(shù)組堆疊在一起蛉鹿,可以指定維度,默認(rèn)維度是0往湿,,即把數(shù)組看作一個(gè)整體堆疊在后面妖异,和concatenate/vstack/hstack的區(qū)別參考:
https://cloud.tencent.com/developer/article/1378491
https://www.cnblogs.com/nkh222/p/8932369.html
舉例:

>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> b = a
>>> np.vstack((a, b))
array([[1, 2, 3],
       [4, 5, 6],
       [1, 2, 3],
       [4, 5, 6]])
>>> np.hstack((a, b))
array([[1, 2, 3, 1, 2, 3],
       [4, 5, 6, 4, 5, 6]])
# 整個(gè)拼在右邊
>>> np.concatenate((a, b))
array([[1, 2, 3],
       [4, 5, 6],
       [1, 2, 3],
       [4, 5, 6]])
>>> np.stack((a, b))
array([[[1, 2, 3],
        [4, 5, 6]],

       [[1, 2, 3],
        [4, 5, 6]]])

stack的第二個(gè)參數(shù),用于設(shè)置在第幾個(gè)維度進(jìn)行堆疊领追,舉例:

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

       [[1, 2, 3],
        [4, 5, 6]]])
# 在第0個(gè)維度堆疊他膳,相當(dāng)于新建一個(gè)維度
>>> np.stack((a, b), axis=0).shape
(2, 2, 3)
# 所以數(shù)據(jù)a從(2, 3) -> (1, 2, 3) -> (2, 2, 3)
>>> np.stack((a, b), axis=1)
array([[[1, 2, 3],
        [1, 2, 3]],

       [[4, 5, 6],
        [4, 5, 6]]])
>>> np.stack((a, b), axis=1).shape
(2, 2, 3)
# 在第1個(gè)維度進(jìn)行堆疊,所以數(shù)據(jù)a從(2, 3) -> (2, 1, 3) -> (2, 2, 3)
>>> np.stack((a, b), axis=2)
array([[[1, 1],
        [2, 2],
        [3, 3]],

       [[4, 4],
        [5, 5],
        [6, 6]]])
>>> np.stack((a, b), axis=2).shape
(2, 3, 2)
# 在第2個(gè)維度進(jìn)行堆疊绒窑,所以數(shù)據(jù)從(2, 3) -> (2, 3, 1) -> (2, 3, 2)
>>> np.stack((a, b), axis=-1)
array([[[1, 1],
        [2, 2],
        [3, 3]],

       [[4, 4],
        [5, 5],
        [6, 6]]])
# -1代表在最后一個(gè)維度進(jìn)行堆疊棕孙,所以看出和2的時(shí)候結(jié)果一樣
linspace()

生成一個(gè)等差數(shù)列,舉例:

>>> np.linspace(-1,1,5, dtype=np.float32)  # -1到1分成5份的等差數(shù)列
array([-1. , -0.5,  0. ,  0.5,  1. ], dtype=float32)
newaxis

如果直接輸出,你會(huì)發(fā)現(xiàn)他就是None(源碼里就是newaxis = None)蟀俊,但是他常被用來(lái)添加一個(gè)新的維度钦铺,比如一維向量變二維矩陣,二維則變?nèi)S等等肢预,可能因?yàn)?code>None在這里有這個(gè)功能矛洞,因?yàn)闉榱朔奖汩喿x程序而設(shè)置了一個(gè)別名,使用舉例:

>>> np.newaxis == None  # 可以發(fā)現(xiàn)他就是None
True
>>> x = np.array([1,2,3,4])
>>> x
array([1, 2, 3, 4])
>>> x.shape  # 可以看出是一維的向量
(4,)
>>> x[:, np.newaxis]
array([[1],
       [2],
       [3],
       [4]])
>>> x[:, np.newaxis].shape  # 變成二維了
(4, 1)
sin()/cos()

正弦/余弦函數(shù)烫映,舉例:

>>> np.sin(math.pi/6)
0.49999999999999994
astype()

類型轉(zhuǎn)換沼本,舉例:

>>> y
array([False, False, False,  True,  True])
>>> y.astype(np.int)  #將bool類型轉(zhuǎn)int
array([0, 0, 0, 1, 1])

數(shù)據(jù)類型范圍:
這里列一些常用數(shù)據(jù)類型及對(duì)應(yīng)范圍:

NaN  沒(méi)有填東西,也就是空
inf  無(wú)窮大
int8  -128~127
uint8  0~256
int16  32768~32767
uint16  0~65535
int/int32  -2^32~2^32-1
float16  半精度浮點(diǎn)型
float32  單精度浮點(diǎn)型
float_/float64  雙精度浮點(diǎn)型

更多參考:https://www.runoob.com/numpy/numpy-dtype.html

dot()

矩陣相乘锭沟,舉例:

>>> x = np.array([[1,2],[3,4]])
>>> y = np.array([[1,1],[1,1]])
>>> np.dot(x, y)
array([[3, 3],
       [7, 7]])

也可以通過(guò)python內(nèi)置的@符號(hào)實(shí)現(xiàn)矩陣相乘抽兆,舉例:

>>> x = np.array([[1,2],[3,4]])
>>> y = np.array([[1,1],[1,1]])
>>> x@y
array([[3, 3],
       [7, 7]])
T

矩陣轉(zhuǎn)置,即x和y對(duì)調(diào)過(guò)來(lái)族淮,舉例:

>>> x = np.array([[1,2], [0, 1]])
>>> x
array([[1, 2],
       [0, 1]])
>>> x.T
array([[1, 0],
       [2, 1]])
mat()

定義矩陣辫红,雖然array也能夠定義矩陣,但并不是真正的矩陣祝辣,只是可以定義矩陣的形狀厉熟,因此也缺少了一些矩陣專門(mén)有的方法,比如求逆矩陣(I屬性實(shí)現(xiàn))较幌,舉例:

>>> x = np.mat([[1,2], [0, 1]])
>>> x
matrix([[1, 2],
        [0, 1]])
>>> x.I
matrix([[ 1., -2.],
        [ 0.,  1.]])
>>> x @ x.I
# 可以看到相乘結(jié)果為1001揍瑟,也就證明是逆矩陣了
matrix([[1., 0.],
        [0., 1.]])
argmax()/argmin()

索引維度當(dāng)中最大值/最小值,舉例:

>>> x = np.array([[0.1, 0.6, 0.1], [0.3, 0.1, 0.6],[0.2, 0.5, 0.3], [0.8, 0.1, 0.1]])
>>> y = np.argmax(x)  #索引整個(gè)數(shù)組最大元素
>>> y
9
#第10個(gè)最大乍炉,為0.8
>>> y = np.argmax(x, axis=1)  #在每個(gè)維度(沿著一維方向)里面索引最大值
>>> y
array([1, 2, 1, 0], dtype=int32)
#每個(gè)維度最大的分別是0.6,0.6,0.5,0.8绢片,位置分別是1,2,1,0
argsort()

沿著索引維度從小到大排序,返回的是排序后的索引岛琼,舉例:

>>> x = np.array([2,1,5,4,3])
>>> x.argsort()
# 可以看到從小到大排序的索引
array([1, 0, 4, 3, 2], dtype=int64)
>>> x[x.argsort()]
# 通過(guò)索引查看對(duì)應(yīng)排序的值
array([1, 2, 3, 4, 5])
>>> (-x).argsort()
# 如果想要從大到小排序底循,可以乘個(gè)負(fù)號(hào)
array([2, 3, 4, 0, 1], dtype=int64)
arctan

計(jì)算某個(gè)點(diǎn)的正切,舉例:

>>> np.arctan(2/1)
1.1071487177940904

如果想知道對(duì)應(yīng)的角度就可以乘以180/π槐瑞,也可以用numpy下的rad2deg()方法熙涤,舉例:

>>> np.arctan(2/1) * 180 / np.pi
63.43494882292201
>>> np.rad2deg(np.arctan(2/1))
63.43494882292201
# 可以看出結(jié)果一樣
arctan2

和上面的很像,也是計(jì)算某個(gè)點(diǎn)的正切困檩。但前者是計(jì)算某個(gè)點(diǎn)在正切曲線上對(duì)應(yīng)的值祠挫,而這個(gè)則是計(jì)算某個(gè)點(diǎn)相對(duì)坐標(biāo)(0, 0)的正切值,傳入前兩個(gè)參數(shù)分別是:y和x(記住第一個(gè)參數(shù)是y不是x)悼沿,舉例:

>>> np.arctan2(2, 1) * 180 / np.pi
# 坐標(biāo)(1, 2)的正切值等舔,可以看出和np.arctan(2/1)一樣
63.43494882292201
>>> np.arctan2(-2, 1) * 180 / np.pi
# 坐標(biāo)(1, -2)的正切值,想象一下糟趾,是在x軸下方慌植,但是角度一樣甚牲,因此為負(fù)
-63.43494882292201
>>> np.arctan2(2, -1) * 180 / np.pi
# 坐標(biāo)(-1, 2)的正切值
116.56505117707799
reshape

改變數(shù)組的形狀,其中-1代表對(duì)剩下的進(jìn)行合并處理蝶柿,舉例:

>>> a = np.random.randint(0, 255, (50, 50, 50))
>>> a.shape
>>> a.reshape(500, 25, 10).shape
# 轉(zhuǎn)成(500, 25, 10)
(500, 25, 10)
>>> a.reshape(50, -1).shape
# 轉(zhuǎn)成(50, 剩下的)
(50, 2500)
>>> a.reshape(500, 10, -1).shape
# 轉(zhuǎn)成(500, 10, 剩下的)
(500, 10, 25)
clip

限制數(shù)組范圍丈钙,舉例:

>>> x = np.array([i for i in range(10)])
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.clip(x, 0, 5)
# 限制數(shù)組x范圍在0~5
array([0, 1, 2, 3, 4, 5, 5, 5, 5, 5])
>>> x = np.array([i+.1 for i in range(10)])
>>> x
array([0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1])
>>> np.clip(x, 0., 5.)
# 對(duì)于超過(guò)范圍的數(shù)進(jìn)行邊界值處理,其他值不會(huì)處理
array([0.1, 1.1, 2.1, 3.1, 4.1, 5. , 5. , 5. , 5. , 5. ])
fabs

對(duì)數(shù)組的值去絕對(duì)值交汤,舉例:

>>> x = np.array([i for i in range(0, -10, -1)])
>>> x
array([ 0, -1, -2, -3, -4, -5, -6, -7, -8, -9])
>>> np.fabs(x)
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
prod

計(jì)算階乘雏赦,舉例:

>>> np.prod(np.array([1,2,3,4]))
# 1*2*3*4
24
cum開(kāi)頭的方法

比如cumsum,可以知道sum是計(jì)算總和蜻展,那么cumsum返回的就是從第一個(gè)到第n個(gè)數(shù)里第n次進(jìn)行操作的結(jié)果,舉例:

>>> np.cumsum(np.array([1,2,3,4]))
# 1, 1+2, 1+2+3, 1+2+3+4
array([ 1,  3,  6, 10], dtype=int32)
>>> np.cumprod(np.array([1,2,3,4]))
array([ 1,  2,  6, 24], dtype=int32)
浮點(diǎn)數(shù)轉(zhuǎn)換整數(shù)

參考:https://blog.csdn.net/sinat_34072381/article/details/84567523`

nonzero

返回所有不為0的數(shù)的索引邀摆,舉例:

>>> np.nonzero(np.array([1,2,3,0,-1,0]))
# 第0纵顾、1、2栋盹、4個(gè)數(shù)不為0
(array([0, 1, 2, 4], dtype=int64),)
>>> x = np.array([[1,0,3], [4,5,0]])
>>> np.nonzero(x)
# 返回2個(gè)數(shù)組施逾,第一個(gè)數(shù)組代表行的索引,第二個(gè)代表列的索引例获,比如這里就是:
# 0行0列汉额、0行2列、1行0列榨汤、1行1列的都不為0蠕搜,這樣也方便我們索引數(shù)據(jù)
(array([0, 0, 1, 1], dtype=int64), array([0, 2, 0, 1], dtype=int64))
>>> x[np.nonzero(x)]
# 可以看到返回所有的非0數(shù)據(jù)
array([1, 3, 4, 5])
pad

填充數(shù)組,舉例:

>>> x = np.array([1,2,3])
>>> x
array([1, 2, 3])
>>> np.pad(x, (1,0), 'constant')
# 在左邊添加一個(gè)0
array([0, 1, 2, 3])
>>> np.pad(x, (1,2), 'constant')
# 在左邊添加1個(gè)0收壕,右邊添加2個(gè)0
array([0, 1, 2, 3, 0, 0])
>>> np.pad(x, (1,2), 'mean')
# 在左邊添加1個(gè)平均值妓灌,右邊添加2個(gè)平均值
array([2, 1, 2, 3, 2, 2])
>>> np.pad(x, (1,2), 'edge')
# 填充邊緣值
array([1, 1, 2, 3, 3, 3])
>>> y = np.random.rand(2, 3)
>>> y
array([[0.47236851, 0.1362846 , 0.16687831],
       [0.57028361, 0.22399912, 0.49424253]])
>>> np.pad(y, (1, 1), 'constant')
# 對(duì)二維數(shù)據(jù)填充,如果只傳入2個(gè)值蜜宪,那么第一個(gè)默認(rèn)是左邊和上邊的填充虫埂,第二個(gè)是右邊和下邊的填充
# 可以看出四邊都填充了0
array([[0.        , 0.        , 0.        , 0.        , 0.        ],
       [0.        , 0.47236851, 0.1362846 , 0.16687831, 0.        ],
       [0.        , 0.57028361, 0.22399912, 0.49424253, 0.        ],
       [0.        , 0.        , 0.        , 0.        , 0.        ]])
>>> np.pad(y, (1, 0), 'constant')
# 就左邊和上邊填充0
array([[0.        , 0.        , 0.        , 0.        ],
       [0.        , 0.47236851, 0.1362846 , 0.16687831],
       [0.        , 0.57028361, 0.22399912, 0.49424253]])
>>> np.pad(y, ((0, 1), (1, 1)), 'constant')
# 如果希望上下左右填充的維度都自己控制,那么就傳入2個(gè)元組圃验,依次代表上下左右
# 可以看到這里就上面沒(méi)填充
array([[0.        , 0.47236851, 0.1362846 , 0.16687831, 0.        ],
       [0.        , 0.57028361, 0.22399912, 0.49424253, 0.        ],
       [0.        , 0.        , 0.        , 0.        , 0.        ]])
>>> np.pad(y, ((0, 1), (0, 1)), 'constant')
# 填充右下
array([[0.47236851, 0.1362846 , 0.16687831, 0.        ],
       [0.57028361, 0.22399912, 0.49424253, 0.        ],
       [0.        , 0.        , 0.        , 0.        ]])

更多參考:https://blog.csdn.net/qq_36332685/article/details/78803622

打印數(shù)組顯示省略問(wèn)題

numpy中一般對(duì)于數(shù)組超過(guò)一定大小掉伏,就會(huì)以省略號(hào)形式顯示,因此為了解決該問(wèn)題澳窑,可以通過(guò)np.set_printoptions(threshold=行數(shù))設(shè)置超過(guò)某個(gè)行數(shù)才以省略形式打印斧散,舉例:

>>> np.set_printoptions(threshold=10)
# 超過(guò)10行就省略號(hào)展示
>>> np.array([[[i] for i in range(100)]])
array([[[ 0],
        [ 1],
        [ 2],
        ...,
        [97],
        [98],
        [99]]])
>>> np.set_printoptions(threshold=100)
# 超過(guò)100行...
>>> np.array([[[i] for i in range(100)]])
# 此處省略100行...
>>> np.set_printoptions(threshold=np.inf)
# 直接點(diǎn),設(shè)置無(wú)窮大展示

踩坑記錄

TypeError: only integer scalar arrays can be converted to a scalar index

看看你使用的方法里是不是傳參有誤摊聋,例如使用concatenate方法拼接數(shù)組時(shí)應(yīng)該把數(shù)組都拼成一個(gè)列表/元組放進(jìn)去:

>>> x = np.array([1,2,3])
>>> y = np.array([4,5,6])
>>> np.concatenate(x, y)
# 拼接報(bào)錯(cuò)颅湘,因?yàn)槿思乙?guī)定第一個(gè)參數(shù)就是接受所有的數(shù)組
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    np.concatenate(x, y)
TypeError: only integer scalar arrays can be converted to a scalar index
>>> np.concatenate((x, y))
# 可以看到拼接成功
array([1, 2, 3, 4, 5, 6])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市栗精,隨后出現(xiàn)的幾起案子闯参,更是在濱河造成了極大的恐慌瞻鹏,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹿寨,死亡現(xiàn)場(chǎng)離奇詭異新博,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脚草,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)赫悄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人馏慨,你說(shuō)我怎么就攤上這事埂淮。” “怎么了写隶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵倔撞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我慕趴,道長(zhǎng)痪蝇,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任冕房,我火速辦了婚禮躏啰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耙册。我一直安慰自己给僵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布详拙。 她就那樣靜靜地躺著想际,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溪厘。 梳的紋絲不亂的頭發(fā)上胡本,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天欢际,我揣著相機(jī)與錄音溅话,去河邊找鬼汗侵。 笑死贡未,一個(gè)胖子當(dāng)著我的面吹牛郭毕,可吹牛的內(nèi)容都是我干的衔肢。 我是一名探鬼主播碧绞,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼从藤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冷冗!你這毒婦竟也來(lái)了守屉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蒿辙,失蹤者是張志新(化名)和其女友劉穎拇泛,沒(méi)想到半個(gè)月后滨巴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俺叭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年恭取,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熄守。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜈垮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裕照,到底是詐尸還是另有隱情攒发,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布晋南,位于F島的核電站惠猿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搬俊。R本人自食惡果不足惜紊扬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一蜒茄、第九天 我趴在偏房一處隱蔽的房頂上張望唉擂。 院中可真熱鬧,春花似錦檀葛、人聲如沸玩祟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)空扎。三九已至,卻和暖如春润讥,著一層夾襖步出監(jiān)牢的瞬間转锈,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工楚殿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撮慨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓脆粥,卻偏偏與公主長(zhǎng)得像砌溺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子变隔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355