43.Python編程:NumPy詳解

前言

numpy是支持 Python語(yǔ)言的數(shù)值計(jì)算擴(kuò)充庫(kù)登颓,其擁有強(qiáng)大的高維度數(shù)組處理與矩陣運(yùn)算能力舌镶。除此之外炕舵,numpy還內(nèi)建了大量的函數(shù)栋荸,方便你快速構(gòu)建數(shù)學(xué)模型菇怀。

NumPy官網(wǎng):http://www.numpy.org/
NumPy官網(wǎng)教程:https://docs.scipy.org/doc/numpy/user/quickstart.html

安裝及導(dǎo)入numpy

安裝numpy:

pip install numpy

導(dǎo)入numpy,推薦做法是:

import numpy as np

當(dāng)然晌块,如果你不想像上面導(dǎo)入爱沟,你也可以和其他模塊導(dǎo)入方式一樣直接import numpy,但還是推薦用import numpy as np這種方式匆背,后面用到numpy的地方都可以用別名np了呼伸,更加簡(jiǎn)潔。

numpy數(shù)學(xué)中的計(jì)算

學(xué)習(xí)完后钝尸,可以熟練掌握數(shù)組各種方式的創(chuàng)建括享、屬性及數(shù)組操作;對(duì)矩陣的常見操作珍促、也可以對(duì)多項(xiàng)式求導(dǎo)铃辖、作圖等。

1.求矩陣A的秩
提示:在線性代數(shù)中猪叙,一個(gè)矩陣A的列秩是A的線性獨(dú)立的縱列的極大數(shù)目娇斩。類似地,行秩是A的線性無(wú)關(guān)的橫行的極大數(shù)目穴翩。通俗一點(diǎn)說(shuō)犬第,如果把矩陣看成一個(gè)個(gè)行向量或者列向量,秩就是這些行向量或者列向量的秩芒帕,也就是極大無(wú)關(guān)組中所含向量的個(gè)數(shù)歉嗓。

矩陣A

解析:在numpy中,求矩陣的秩用nf.linalg.matrix_rank(array)

2.求矩陣A的轉(zhuǎn)置矩陣
轉(zhuǎn)置矩陣:將矩陣的行列互換得到的新矩陣稱為轉(zhuǎn)置矩陣背蟆,轉(zhuǎn)置矩陣的行列式不變鉴分。
解析:在numpy中,求矩陣A的轉(zhuǎn)置矩陣用A.T
上面兩個(gè)問題用numpy可快速計(jì)算出來(lái):

import numpy as nf

A = nf.mat([[3, 2, 0, 5, 0],
            [3, -2, 3, 6, -1],
            [2, 0, 1, 5, -3],
            [1, 6, -4, -1, 4]])

print("矩陣A:")
print(A)
print("A的秩為:{}".format(nf.linalg.matrix_rank(A)))

print("A的轉(zhuǎn)置矩陣:")
print(A.T)

運(yùn)行結(jié)果:

矩陣A:
[[ 3  2  0  5  0]
 [ 3 -2  3  6 -1]
 [ 2  0  1  5 -3]
 [ 1  6 -4 -1  4]]

A的秩為:3

A的轉(zhuǎn)置矩陣:
[[ 3  3  2  1]
 [ 2 -2  0  6]
 [ 0  3  1 -4]
 [ 5  6  5 -1]
 [ 0 -1 -3  4]]

手動(dòng)求解:


手動(dòng)求解矩陣A的秩

3.求矩陣A的逆矩陣
說(shuō)明:逆矩陣是對(duì)方陣定義的淆储,因此逆矩陣一定是方陣冠场。
逆矩陣:設(shè)A是數(shù)域上的一個(gè)n階矩陣家浇,若在相同數(shù)域上存在另一個(gè)n階矩陣B本砰,使得: AB=BA=E ,則我們稱B是A的逆矩陣钢悲,而A則被稱為可逆矩陣点额。注:E為單位矩陣舔株。

矩陣A

解析:在numpy中,求矩陣A的轉(zhuǎn)置矩陣用A.I

import numpy as nf

A = nf.mat([[0, 1, 2],
            [1, 1, 4],
            [2, -1, 0]])

print("矩陣A:")
print(A)

print("A的逆矩陣:")
print(A.I)

運(yùn)行結(jié)果:

矩陣A:
[[ 0  1  2]
 [ 1  1  4]
 [ 2 -1  0]]

A的逆矩陣:
[[ 2.  -1.   1. ]
 [ 4.  -2.   1. ]
 [-1.5  1.  -0.5]]

手動(dòng)計(jì)算:


手動(dòng)計(jì)算求矩陣A的逆矩陣

4.求y = -2x^2 + 4x + 16的根还棱,并求出其導(dǎo)函數(shù)

多項(xiàng)式 -2x^2 + 4x + 16的圖像

解析:為了形象展示多項(xiàng)式载慈,我們借用matplotlib順便繪制了該函數(shù)的圖像。后面會(huì)專門學(xué)習(xí)如何繪制珍手,此處大概了解一下matplotlib即可办铡。numpy中的多項(xiàng)式:np.poly1d(arr),需要把參數(shù)傳入琳要。本例子中放在了一個(gè)數(shù)組中arr = np.array([-2, 4, 16])傳入的寡具。對(duì)多項(xiàng)式求導(dǎo),想要求幾階導(dǎo)數(shù)稚补,只需要這里實(shí)參m傳入數(shù)字幾即可童叠。func.deriv(m=1);定制定義域np.linspace(-4, 6, 100)课幕,這樣把-6--6之間進(jìn)行100等分厦坛,利用這些數(shù)據(jù)創(chuàng)建了一個(gè)長(zhǎng)度為100的數(shù)組。

import numpy as np
import matplotlib.pyplot as plt

# y = -2x^2 + 4x + 16
arr = np.array([-2, 4, 16])
func = np.poly1d(arr)

# m=1表示求一階導(dǎo)數(shù)乍惊,依次類推
func1 = func.deriv(m=1)

# 設(shè)置定義域-4,6杜秸;并將定義域等分了100份
x = np.linspace(-4, 6, 100)

y = func(x)
y1 = func1(x)


# 打印多項(xiàng)式
print(func)

# 打印多項(xiàng)式對(duì)應(yīng)的一階導(dǎo)數(shù)
print(func1)

# 繪制
plt.plot(x, y, label="{}".format(func))
plt.plot(x, y1, label="{}".format(func1))
plt.xlabel("x")
plt.ylabel("y")

# 顯示圖例
plt.legend()

print("多項(xiàng)式的根:")
print(np.roots(func))

# 顯示圖像
plt.show()

運(yùn)行結(jié)果:


多項(xiàng)式求根及一階導(dǎo)數(shù)

數(shù)組的重要屬性

numpy的主要操作對(duì)象是同類的多維數(shù)組,即一個(gè)由相同類型元素(通常是數(shù)字)組成的润绎、以正數(shù)為索引的數(shù)據(jù)表亩歹。在numpy里面,維度稱為“軸”凡橱。

舉例來(lái)說(shuō)小作,三維空間內(nèi)一點(diǎn)的坐標(biāo)[1,2,1]有一個(gè)軸,三個(gè)元素稼钩,所以我們通常稱它的長(zhǎng)度為3顾稀。在以下所示的例子中,數(shù)組有兩個(gè)軸坝撑,第一個(gè)軸的長(zhǎng)度為2静秆,第二個(gè)軸的長(zhǎng)度為3。

[[ 1., 0., 0.],
 [ 0., 1., 2.]]

numpy的數(shù)組類型叫做ndarray巡李,也就是numpy數(shù)組(以下簡(jiǎn)稱為數(shù)組)抚笔。需要注意的是,numpy.array不同于Python標(biāo)準(zhǔn)庫(kù)中的array.array,后者只處理一維的數(shù)組并且提供了很少的功能侨拦。一個(gè)ndarray對(duì)象有以下一些重要的屬性:

  • ndarray.ndim

數(shù)組的軸的數(shù)量殊橙,即維度數(shù)量。

  • ndarray.shape

數(shù)組的維度。返回的是一個(gè)整數(shù)元組膨蛮,指示了一個(gè)數(shù)組在各個(gè)維度的大小叠纹。對(duì)于一個(gè)n行m列的矩陣來(lái)說(shuō),它的shape(n,m)敞葛。shape的元組長(zhǎng)度因此是軸的數(shù)量誉察,即ndim

  • ndarray.size

數(shù)組所有元素的數(shù)量惹谐,等于shape返回元組元素的乘積持偏。

  • ndarray.dtype

一個(gè)用于描述數(shù)組元素類型的對(duì)象“奔。可以用標(biāo)準(zhǔn)Python類型來(lái)創(chuàng)造或指定dtype的類型综液。另外,Numpy也提供了自己的類型儒飒,如numpy.int32谬莹,numpy.int16numpy.float64等桩了。

  • ndarray.itemsize

數(shù)組每個(gè)元素的字節(jié)大小附帽。比如一個(gè)數(shù)組的元素為float64,它的itemsize8(=64/8)井誉,

complex32itemsize4(=32/8)蕉扮。這個(gè)屬性等同于ndarray.dtype.itemsize

  • ndarray.data

包含了數(shù)組每個(gè)實(shí)際元素的緩沖器颗圣。一般來(lái)說(shuō)我們不會(huì)用到這個(gè)屬性因?yàn)槲覀兛梢酝ㄟ^(guò)索引工具來(lái)獲取到數(shù)組的每個(gè)元素的值喳钟。

數(shù)組的創(chuàng)建

通過(guò)上面知識(shí),我們已經(jīng)知道在numpy中在岂,數(shù)組是ndarray類型的奔则,接下來(lái)我們就看看學(xué)習(xí)如何利用numpy來(lái)創(chuàng)建各種數(shù)組。

1.利用構(gòu)造函數(shù)array()創(chuàng)建

利用構(gòu)造函數(shù)array()創(chuàng)建一維或多維數(shù)組蔽午,其參數(shù)是類似于數(shù)組的對(duì)象易茬,如列表等。當(dāng)然及老,也可以在創(chuàng)建的時(shí)候傳入數(shù)據(jù)類型抽莱,通過(guò)dtype=指定,取值:
int系列包括np.int64(默認(rèn))骄恶、np.int16食铐、np.int32np.int128僧鲁;
float系列包括:np.float64(默認(rèn))虐呻、np.float16象泵、np.float32np.float84铃慷、np.float96单芜、np.float128蜕该、np.float256等犁柜,示例如下:

import numpy as np

# 構(gòu)造函數(shù)構(gòu)建
arr1 = np.array([[1, 2, 3],
                [4, 5, 6]])

# 創(chuàng)建的同時(shí)指定數(shù)據(jù)類型為float64
arr2 = np.array([[11, 22, 33],
                [44, 55, 66]], dtype=np.float64)

print(arr1)
print(arr2)

運(yùn)行結(jié)果:

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

[[11. 22. 33.]
 [44. 55. 66.]]
2.利用arrange()創(chuàng)建

numpyarrange()的用法和Pythonrange()一樣,我們可以直接傳入一個(gè)size堂淡,也可以指定起始值-結(jié)束值-步長(zhǎng)馋缅,numpyarrange()還可以重新定義reshape(shape),如下面例子2.3中:np.arange(12).reshape((3, 4))绢淀。示例如下:

import numpy as np

# 2.1利用arrange()來(lái)創(chuàng)建
arr3 = np.arange(12)
print(arr3)
print("-" * 20)

# 2.2利用arrange()來(lái)創(chuàng)建,
arr4 = np.arange(10, 21)
print(arr4)
print("+" * 20)

# 2.3利用arrange()來(lái)創(chuàng)建,重新定義shape
arr5 = np.arange(12).reshape((3, 4))
print(arr5)

運(yùn)行結(jié)果:

[ 0  1  2  3  4  5  6  7  8  9 10 11]
--------------------
[10 11 12 13 14 15 16 17 18 19 20]
++++++++++++++++++++
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
3.生產(chǎn)隨機(jī)數(shù)來(lái)創(chuàng)建

利用np.random.random(12)會(huì)生產(chǎn)一系列從0-1之間的符合標(biāo)準(zhǔn)正態(tài)分布隨機(jī)數(shù)組成的數(shù)組萤悴。我們指定隨機(jī)數(shù)的個(gè)數(shù),即要得到的數(shù)組長(zhǎng)度皆的,還可以在創(chuàng)建的同時(shí)重新定義shape:np.random.random((3, 4))覆履。示例如下,要注意觀察不同:

import numpy as np

# 3.1 利用隨機(jī)數(shù)創(chuàng)建數(shù)組
random_arr4 = np.random.random(12)
print(random_arr4)

print("-" * 20)

# 3.2 利用隨機(jī)數(shù)創(chuàng)建數(shù)組, 并指定shape
random_arr5 = np.random.random((3, 4))
print(random_arr5)

運(yùn)行結(jié)果:

[0.47430035 0.27107492 0.786811  0.4158894  0.09536015  0.87473283  0.10045984 0.70662808 0.15931372 0.96116861 0.45779735 0.18718144]
--------------------
[[0.4010681  0.0760198  0.03891688 0.80331814]
 [0.33589807 0.43356063 0.79576128 0.74174092]
 [0.31945365 0.21740648 0.68029056 0.32781636]]
4.利用linspace()線性等分來(lái)創(chuàng)建

numpylinspace(start, end, total_count)線性等分來(lái)創(chuàng)建數(shù)組時(shí)费薄,需要傳入起始值硝全、結(jié)束值、將這段數(shù)等分為total_count份楞抡。

這種創(chuàng)建方式特別適用于:知道起始值伟众、結(jié)束值和總個(gè)數(shù)的情況。常用來(lái)設(shè)置自變量的取值召廷,例如:x = np.linspace(-10, 10, 100),將會(huì)得到(-10, 10)等分100份后的數(shù)據(jù)組成的數(shù)組凳厢。

import numpy as np

# 4 利用線性等分,創(chuàng)建數(shù)組
x = np.linspace(-10, 10, 50)
print(x)

運(yùn)行結(jié)果:

[-10.          -9.59183673  -9.18367347  -8.7755102   -8.36734694
  -7.95918367  -7.55102041  -7.14285714  -6.73469388  -6.32653061
  -5.91836735  -5.51020408  -5.10204082  -4.69387755  -4.28571429
  -3.87755102  -3.46938776  -3.06122449  -2.65306122  -2.24489796
  -1.83673469  -1.42857143  -1.02040816  -0.6122449   -0.20408163
   0.20408163   0.6122449    1.02040816   1.42857143   1.83673469
   2.24489796   2.65306122   3.06122449   3.46938776   3.87755102
   4.28571429   4.69387755   5.10204082   5.51020408   5.91836735
   6.32653061   6.73469388   7.14285714   7.55102041   7.95918367
   8.36734694   8.7755102    9.18367347   9.59183673  10.        ]
5.全為0的數(shù)組np.zeros(shape)

numpy提供了可以直接創(chuàng)建所有元素為0的數(shù)組竞慢,方式為:np.zeros(shape)先紫。

官網(wǎng)的解釋:The function zeros creates an array full of zeros,示例如下:

import numpy as np

# 5 全為0的數(shù)組
arr5 = np.zeros((3, 4))
print(arr5)

運(yùn)行結(jié)果:

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
6.全為1的數(shù)組np.ones(shape)

numpy提供了可以直接創(chuàng)建所有元素為1的數(shù)組筹煮,方式為:np.ones(shape)泡孩。

官網(wǎng)的解釋:the function ones creates an array full of ones,示例如下:

import numpy as np

# 6 全為1的數(shù)組
arr6 = np.ones((2, 3, 4))
print(arr6)

運(yùn)行結(jié)果:

[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]]
7.空元素?cái)?shù)組

numpy提供了可以直接創(chuàng)建所有元素為1的數(shù)組寺谤,方式為:np.empty(shape)仑鸥,要注意的是它的元素的初始值是隨機(jī)的,這取決于這塊內(nèi)存中的值变屁。

官網(wǎng)的解釋:the function empty creates an array whose initial content is random and depends on the state of the memory. By default, the dtype of the created array is float64眼俊,示例如下:

import numpy as np

# 創(chuàng)建空元素?cái)?shù)組
arr7 = np.empty((3, 4))
print(arr7)
numpy中dtype類型
numpy數(shù)組生成函數(shù)匯總表

數(shù)組的常見操作

1.基本運(yùn)算
  • 加、減粟关、乘疮胖、除(+、-、*澎灸、/)

對(duì)兩個(gè)數(shù)組做加(減院塞、乘、除)法運(yùn)算性昭,是對(duì)應(yīng)位置的元素分別做加(減拦止、乘、除)法運(yùn)算糜颠。
示例如下:

import numpy as np

arr1 = np.array([[11, 12, 13],
                 [14, 15, 16]])

arr2 = np.array([[1, 2, 3],
                 [4, 5, 6]])

print("arr1:")
print(arr1)
print("arr2:")
print(arr2)

print("arr1 + arr2 = ")
print(arr1 + arr2)

print("arr1 - arr2 = ")
print(arr1 - arr2)

print("arr2 * arr1 = ")
print(arr2 * arr1)

print("arr1 / arr2 = ")
print(arr1 / arr2)

運(yùn)行結(jié)果:

arr1:
[[11 12 13]
 [14 15 16]]

arr2:
[[1 2 3]
 [4 5 6]]

arr1 + arr2 = 
[[12 14 16]
 [18 20 22]]

arr1 - arr2 = 
[[10 10 10]
 [10 10 10]]

arr2 * arr1 = 
[[11 24 39]
 [56 75 96]]

arr1 / arr2 = 
[[11.          6.          4.33333333]
 [ 3.5         3.          2.66666667]]

說(shuō)明:對(duì)兩個(gè)數(shù)組做加(減汹族、乘、除)法運(yùn)算其兴,是對(duì)應(yīng)位置的元素分別做加(減顶瞒、乘、除)法運(yùn)算元旬。正因?yàn)槿绱艘?guī)則榴徐,所以要求參與運(yùn)算的兩個(gè)數(shù)組為同形數(shù)組,也就是要求shape必須一樣匀归,否則會(huì)報(bào)錯(cuò)ValueError: operands could not be broadcast together with shapes坑资。

下面例子中,保持arr1shape(2, 3)不變朋譬;利用reshape()修改arr2shape(6,)盐茎,此時(shí)再進(jìn)行加法運(yùn)算操作:

import numpy as np

arr1 = np.array([[11, 12, 13],
                 [14, 15, 16]])

arr2 = np.array([[1, 2, 3],
                 [4, 5, 6]]).reshape((6,))

print("arr1:")
print(arr1)
print("arr2:")
print(arr2)

print("arr1 + arr2 = ")
print(arr1 + arr2)

運(yùn)算結(jié)果:

Traceback (most recent call last):
  File "D:/TensorFlowProjects/np_numpy/numpy_jianshu.py", line 15, in <module>
    print(arr1 + arr2)
ValueError: operands could not be broadcast together with shapes (2,3) (6,) 
  • 多次方(**)

在numpy中,多次方運(yùn)算同樣作用于數(shù)組中每個(gè)元素徙赢。運(yùn)算符號(hào)為**字柠,運(yùn)算符**后面是幾就做幾次運(yùn)算。同樣要求參與運(yùn)算的兩個(gè)數(shù)組為同形數(shù)組狡赐,也就是要求shape必須一樣窑业,否則會(huì)報(bào)錯(cuò)ValueError: operands could not be broadcast together with shapes

例如:arr1 ** 2表示對(duì)數(shù)組arr1中每個(gè)元素做平方運(yùn)算枕屉。
再如:arr1 ** 3表示對(duì)數(shù)組arr1中每個(gè)元素做3次方運(yùn)算常柄。

import numpy as np

arr1 = np.arange(6).reshape((2, 3))
print("arr1: ")
print(arr1)

print("-" * 20)

# 2次方運(yùn)算
print(arr1 ** 2)

print("-" * 20)

# 3次方運(yùn)算
print(arr1 ** 3)

運(yùn)算結(jié)果:

arr1: 
[[0 1 2]
 [3 4 5]]
--------------------
[[ 0  1  4]
 [ 9 16 25]]
--------------------
[[  0   1   8]
 [ 27  64 125]]
  • 矩陣乘

矩陣乘是用np提供的dot,形如:np.dot(arr1, arr2)arr1.dot(arr2)搀擂。需要注意的是西潘,參與運(yùn)算的兩個(gè)數(shù)組要符合矩陣乘的乘法要求:前一個(gè)矩陣的列必須等于后一個(gè)矩陣的行。如果不滿足此哨颂,則會(huì)運(yùn)行報(bào)錯(cuò)喷市。

下面例子,3行4列 x 4行2列威恼,計(jì)算后將會(huì)得到3行2列的矩陣品姓。

import numpy as np


arr1 = np.arange(12).reshape((3, 4))
arr2 = np.arange(8).reshape((4, 2))
print("arr1 = ")
print(arr1)
print("arr2 = ")
print(arr2)

print("-" * 20)
print(np.dot(arr1, arr2))

print("+" * 20)
print(arr1.dot(arr2))

運(yùn)算結(jié)果:

arr1 = 
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
arr2 = 
[[0 1]
 [2 3]
 [4 5]
 [6 7]]
--------------------
[[ 28  34]
 [ 76  98]
 [124 162]]
++++++++++++++++++++
[[ 28  34]
 [ 76  98]
 [124 162]]

提示:
如果你在運(yùn)算過(guò)程中遇到ValueError: shapes (3,4) and (3,2) not aligned: 4 (dim 1) != 3 (dim 0)寝并,則說(shuō)明參與運(yùn)算的兩個(gè)矩陣不符合矩陣乘的運(yùn)算規(guī)則:前一個(gè)矩陣的列必須等于后一個(gè)矩陣的行。

  • 和數(shù)值比較

和數(shù)值比較腹备,形如arr1 > 3衬潦,會(huì)把數(shù)組中每個(gè)元素和該數(shù)值3進(jìn)行比較,滿足則為True,不滿足則為False植酥,最后會(huì)得到一個(gè)由True镀岛、False組成的數(shù)組。

import numpy as np


arr1 = np.array([[0, 2, 4],
                 [1, 3, 5]])
print(arr1 > 3)

運(yùn)算結(jié)果:

[[0 2 4]
 [1 3 5]]

[[False False  True]
 [False False  True]]
  • 求和

numpy中求和提供了sum惧互,可以計(jì)算一個(gè)數(shù)組中所有元素的和np.sum(arr)哎媚,也可以指定計(jì)算某個(gè)軸上的和np.sum(arr喇伯,axis=0或1或2等)喊儡。

如果是2維數(shù)組,axis=0表示計(jì)算列上的和稻据;axis=1表示計(jì)算行上的和艾猜;

import numpy as np

arr_2d = np.arange(12).reshape((3, 4))
print(arr_2d)

# 計(jì)算所有元素的和
print(np.sum(arr_2d))
print("-" * 20)
# 計(jì)算指定軸上的元素的和
print(np.sum(arr_2d, axis=0))
print("-" * 20)
print(np.sum(arr_2d, axis=1))

運(yùn)行結(jié)果:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
66
--------------------
[12 15 18 21]
--------------------
[ 6 22 38]

如果是3維數(shù)組,形如shape 為 (2, 3, 4)的捻悯,此時(shí)axis=0表示計(jì)算shape(3, 4)數(shù)組求和匆赃,計(jì)算后會(huì)得到一個(gè)(3, 4)數(shù)組。今缚;axis=1表示計(jì)算列上的和算柳,計(jì)算后會(huì)得到一個(gè)(2, 4)數(shù)組;axis=2表示計(jì)算行上的和姓言,計(jì)算后會(huì)得到一個(gè)(2, 3)數(shù)組瞬项;

import numpy as np

arr_3d = np.arange(24).reshape((2, 3, 4))
print(arr_3d)

# 計(jì)算所有元素的和
print("所有元素的和:{}".format(np.sum(arr_3d)))

# 計(jì)算指定軸上的元素的和
print("axis=0,shape=(2, 3, 4),會(huì)得到(3, 4)的數(shù)組:")
print(np.sum(arr_3d, axis=0))

print("axis=1,shape=(2, 3, 4),會(huì)得到(2, 4)的數(shù)組:")
print(np.sum(arr_3d, axis=1))

print("axis=2,shape=(2, 3, 4),會(huì)得到(2, 3)的數(shù)組:")
print(np.sum(arr_3d, axis=2))

運(yùn)行結(jié)果:

[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

所有元素的和:276

axis=0,shape=(2, 3, 4),會(huì)得到(3, 4)的數(shù)組:
[[12 14 16 18]
 [20 22 24 26]
 [28 30 32 34]]

axis=1,shape=(2, 3, 4),會(huì)得到(2, 4)的數(shù)組:
[[12 15 18 21]
 [48 51 54 57]]

axis=2,shape=(2, 3, 4),會(huì)得到(2, 3)的數(shù)組:
[[ 6 22 38]
 [54 70 86]]

如果是更高維數(shù)組,則依次類推何荚。關(guān)鍵是區(qū)分軸序號(hào)代表的是什么囱淋。

  • 求最大值

numpy中求最大值提供了max,可以計(jì)算一個(gè)數(shù)組中所有元素中最大的元素np.max(arr)餐塘,也可以指定計(jì)算某個(gè)軸上的最大的元素np.max(arr妥衣,axis=0或1或2等)

求最大值所在的索引戒傻,np.argmax(arr税手,axis=0或1或2等)

import numpy as np

arr_2d = np.array([[2, 4, 6],
                   [1, 3, 5]])
print(arr_2d)

# 數(shù)組中最大元素
print("數(shù)組中最大元素{}".format(np.max(arr_2d)))

print("數(shù)組中最大元素索引{}".format(np.argmax(arr_2d)))

# 2維的軸axis=0上的最大值,也即列上的最大值
print("列上的最大值{}".format(np.max(arr_2d, axis=0)))

運(yùn)行結(jié)果:

[[2 4 6]
 [1 3 5]]
數(shù)組中最大元素:6
數(shù)組中最大元素索引:2
列上的最大值:[2 4 6]
  • 求最小值

numpy中求最小值提供了min需纳,可以計(jì)算一個(gè)數(shù)組中所有元素最小元素值np.min(arr)芦倒,也可以指定計(jì)算某個(gè)軸上的最小元素值np.min(arr,axis=0或1或2等)候齿。

求最小值所在的索引熙暴,np.argmin(arr闺属,axis=0或1或2等)

import numpy as np

arr_2d = np.array([[2, 4, 6],
                   [1, 3, 5]])
print(arr_2d)

# 數(shù)組中最小元素
print("數(shù)組中最小元素:{}".format(np.min(arr_2d)))

print("數(shù)組中最小元素索引:{}".format(np.argmin(arr_2d)))

# 2維的軸axis=0上的最小值,也即列上的最小值
print("列上的最小值:{}".format(np.min(arr_2d, axis=0)))

運(yùn)行結(jié)果:

[[2 4 6]
 [1 3 5]]
數(shù)組中最小元素:1
數(shù)組中最小元素索引:3
列上的最小值:[1 3 5]
  • 求平均數(shù)周霉、中位數(shù)掂器、加權(quán)平均數(shù)

numpy中求平均數(shù)、中位數(shù)俱箱、加權(quán)平均數(shù)国瓮,分別提供了mean(arr)media(arr)狞谱、average(arr)乃摹,也可以指定計(jì)算某個(gè)軸上的平均數(shù)、中位數(shù)跟衅、加權(quán)平均數(shù)孵睬。

import numpy as np

arr_2d = np.arange(12).reshape((3, 4))

# 權(quán)重,加權(quán)平均數(shù)時(shí)用到了
weights = np.array([[1, 1, 1, 1],
                    [1, 1, 1, 1],
                    [1, 1, 1, 2]])

print(arr_2d)
print(weights)

print("平均數(shù){}".format(np.mean(arr_2d)))
print("中位數(shù){}".format(np.median(arr_2d)))
print("加權(quán)平均數(shù){}".format(np.average(arr_2d, weights=weights)))

運(yùn)算結(jié)果:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 2]]

平均數(shù)5.5
中位數(shù)5.5
加權(quán)平均數(shù)5.923076923076923
  • 累和

numpy中求累和提供了cumsum,可以計(jì)算一個(gè)數(shù)組中求累和np.cumsum(arr)伶跷,也可以指定計(jì)算某個(gè)軸上求累和np.cumsum(arr掰读,axis=0或1或2等)

import numpy as np

arr1 = np.arange(6)
print(arr1)

# 求累和
print(np.cumsum(arr1))

運(yùn)算結(jié)果:

[0 1 2 3 4 5]
[ 0  1  3  6 10 15]

累和計(jì)算規(guī)則如圖:


累和計(jì)算規(guī)則
  • 累差

numpy中求累和提供了diff叭莫,可以計(jì)算一個(gè)數(shù)組中求累和np.diff(arr)蹈集,也可以指定計(jì)算某個(gè)軸上求累和np.diff(arr,axis=0或1或2等)雇初。

import numpy as np

arr1 = np.array([1, 3, 5, 2, 4, 6])
print(arr1)

# 求累差
print(np.diff(arr1))

運(yùn)行結(jié)果:

[1 3 5 2 4 6]
[ 2  2 -3  2  2]
累差
  • 非零元素

numpy中找一個(gè)數(shù)組中非零元素提供了np.nonzero(arr)拢肆,示例如下:

import numpy as np

arr_2d = np.arange(12).reshape((3, 4))
print(arr_2d)

print(np.nonzero(arr_2d))

運(yùn)行結(jié)果:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), 
 array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))

解析:調(diào)用非零元素方法得到了(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64)),由于原數(shù)組是2維的靖诗,所以打印結(jié)果中這個(gè)包含兩個(gè)數(shù)組郭怪,分別表示:非零元素所在的行的索引組成的數(shù)組,非零元素所在的列的索引組成的數(shù)組呻畸。

可以看到除了(0,0)處的元素外移盆,其余都非零,所以有上面的打印結(jié)果伤为。

  • 排序

numpy中排序提供了sort咒循,可以指定某個(gè)軸上元素排序np.sort(arr赊窥,axis=0或1或2等)薯鼠,也可以指定排序使用的方法,kind數(shù)組排序時(shí)使用的方法枉长。

a :所需排序的數(shù)組
axis:數(shù)組排序時(shí)的基準(zhǔn)位衩,axis=0裆蒸,按行排列;axis=1糖驴,按列排列
kind:數(shù)組排序時(shí)使用的方法僚祷,其中: kind= ′ quicksort ′ 為快排佛致;kind= ′ mergesort ′ 為混排;kind= ′ heapsort ′ 為堆排辙谜;
order:一個(gè)字符串或列表俺榆,可以設(shè)置按照某個(gè)屬性進(jìn)行排序。

import numpy as np

arr1 = np.array([[1, 13, 5, 12, 4, 6],
                [10, 11, 12, 7, 8, 9]])
print(arr1)

print("-" * 20)
print(np.sort(arr1))

print("-" * 20)
# axis=0 對(duì)每一列中的元素排序
print(np.sort(arr1, axis=0, kind="quicksort"))

print("-" * 20)

# axis=1 對(duì)每一行中的元素排序
print(np.sort(arr1, axis=1))

運(yùn)行結(jié)果:

[[ 1 13  5 12  4  6]
 [10 11 12  7  8  9]]
--------------------
[[ 1  4  5  6 12 13]
 [ 7  8  9 10 11 12]]
--------------------
[[ 1 11  5  7  4  6]
 [10 13 12 12  8  9]]
--------------------
[[ 1  4  5  6 12 13]
 [ 7  8  9 10 11 12]]
  • 矩陣的轉(zhuǎn)置

numpy對(duì)矩陣的轉(zhuǎn)置提供了多種實(shí)現(xiàn)方式装哆,最常用的arr.Tnp.transpose(arr)罐脊。需要注意的是,numpy提供了迭代行蜕琴,并沒有提供直接迭代列萍桌。若要迭代列,一般都是先轉(zhuǎn)置一下再迭代行就行了凌简。

import numpy as np

arr_2d = np.arange(12).reshape((3, 4))
print(arr_2d)

print("-" * 20)

# 矩陣的轉(zhuǎn)置,方式1
print(arr_2d.T)

print("-" * 20)

# 矩陣的轉(zhuǎn)置,方式2
print(np.transpose(arr_2d))

運(yùn)行結(jié)果:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
--------------------
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
--------------------
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
  • 數(shù)據(jù)裁剪處理

numpy對(duì)數(shù)組中的元素提供了裁剪處理的方法np.clip(arr, min, max)上炎, 對(duì)該函數(shù)的理解:小于最小值得按最小值處理;大于最大值的按最大值處理号醉,處于最小值和最大值之間的保留原數(shù)據(jù)反症。示例如下:

import numpy as np

arr_2d = np.arange(12).reshape((3, 4))
print(arr_2d)

# 數(shù)據(jù)的裁剪
print(np.clip(arr_2d, 5, 8))

運(yùn)行結(jié)果:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

[[5 5 5 5]
 [5 5 6 7]
 [8 8 8 8]]
  • 展開鋪平

numpy對(duì)數(shù)組中可以重新定義shape, 方法是reshape(shape)辛块,也提供了降維處理畔派,直接展開鋪平為一維arr.flatten()。示例如下:

import numpy as np

arr_2d = np.arange(12).reshape((3, 4))
print(arr_2d)

# 展開鋪平操作
print(arr_2d.flatten())

運(yùn)行結(jié)果:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

[ 0  1  2  3  4  5  6  7  8  9 10 11]
2.array合并

數(shù)組的合并润绵,分為在垂直方向合并np.vstack((arr1, arr2))和在水平方向合并np.hstack((arr1, arr2))线椰。

import numpy as np


arr1 = np.array([1, 1, 1])
arr2 = np.array([2, 2, 2])
print(arr1)
print("-" * 10)
print(arr2)

print("在列方向合并:")
print(np.vstack((arr1, arr2)))

print("在行方向合并:")
print(np.hstack((arr1, arr2)))

運(yùn)行結(jié)果:

[1 1 1]
----------
[2 2 2]

在列方向合并:
[[1 1 1]
 [2 2 2]]

在行方向合并:
[1 1 1 2 2 2]

當(dāng)然,也可以使用np.concatenate((arr1, arr2), axis=0或1或2等):

import numpy as np


arr1 = np.array([[1, 2],
                [3, 4]])
arr2 = np.array([[5, 6]])
print(arr1)
print("-" * 10)
print(arr2)

print("在垂直方向合并:")
print(np.concatenate((arr1, arr2), axis=0))

print("在水平方向合并:")
print(np.concatenate((arr1, arr2.T), axis=1))

運(yùn)行結(jié)果:

[[1 2]
 [3 4]]
----------
[[5 6]]

在列方向合并:
[[1 2]
 [3 4]
 [5 6]]

在行方向合并:
[[1 2 5]
 [3 4 6]]
3.array分割

數(shù)組的拆分尘盼,分為在垂直方向拆分np.vsplit(arr1, 幾等分)和在水平方向拆分np.hsplit(arr1, 幾等分)憨愉。

import numpy as np

arr_2d = np.arange(24).reshape((4, 6))
print(arr_2d)

# 在垂直方向上等分2份
print(np.vsplit(arr_2d, 2))

# 在水平方向上等分2份
print(np.hsplit(arr_2d, 2))

運(yùn)行結(jié)果:

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

[array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]]), 
array([[12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])]

[array([[ 0,  1,  2],
       [ 6,  7,  8],
       [12, 13, 14],
       [18, 19, 20]]), 
array([[ 3,  4,  5],
       [ 9, 10, 11],
       [15, 16, 17],
       [21, 22, 23]])]

當(dāng)然,也可以使用np.split(arr1, axis=0或1或2等):

import numpy as np

arr_2d = np.arange(24).reshape((4, 6))
print(arr_2d)

# 在垂直方向上等分2份
print(np.split(arr_2d, 2, axis=0))

# 在水平方向上等分3份
print(np.split(arr_2d, 3, axis=1))

運(yùn)行結(jié)果:

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

[array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]]), 
array([[12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])]

[array([[ 0,  1],
       [ 6,  7],
       [12, 13],
       [18, 19]]),
 array([[ 2,  3],
       [ 8,  9],
       [14, 15],
       [20, 21]]), 
array([[ 4,  5],
       [10, 11],
       [16, 17],
       [22, 23]])]
4.array的copy

numpy中數(shù)組的賦值操作卿捎,默認(rèn)是不進(jìn)行拷貝的配紫。下面例子中,arr1 和arr2指向了內(nèi)存中的同一內(nèi)存地址午阵,是不同變量指向了同一對(duì)象躺孝。

import numpy as np

# 創(chuàng)建數(shù)組arr1
arr1 = np.array([[1, 2, 3],
                 [4, 5, 6]])

# 把數(shù)組arr1賦值給數(shù)組arr2,
arr2 = arr1

print(arr1)
print(arr2)

# arr1和arr2是否同一對(duì)象
print(arr1 is arr2)

運(yùn)行結(jié)果:

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

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

True

通過(guò)一個(gè)變量修改數(shù)組的值底桂,由于兩個(gè)數(shù)組變量指向同一對(duì)象植袍,所以另一處的值也是被修改后的:

# 上接
arr1[1][1] = 15
print(arr1)
print(arr2)

運(yùn)行結(jié)果:

[[ 1  2  3]
 [ 4 15  6]]

[[ 1  2  3]
 [ 4 15  6]]

上面例子中,之前一處兩個(gè)變量指向的同一數(shù)組籽懦,數(shù)據(jù)發(fā)生了變化于个。是因?yàn)?code>arr2 = arr1這句賦值操作默認(rèn)采用的不拷貝。暮顺,如果厅篓,我想讓arr1和arr2是獨(dú)立的存在秀存,當(dāng)一處修改,另一處數(shù)據(jù)不變動(dòng)羽氮。那么只需要賦值時(shí)采用copy復(fù)制一份即可应又。代碼如下:

import numpy as np

# 創(chuàng)建數(shù)組arr1
arr1 = np.array([[1, 2, 3],
                 [4, 5, 6]])

# 把數(shù)組arr1賦值給數(shù)組arr2,
arr2 = arr1.copy()


print(arr1)
print(arr2)

# arr1和arr2是否同一對(duì)象
print("arr1和arr2是否同一對(duì)象:{}".format(arr1 is arr2))

# 修改arr1[1][1]的元素的值為15
arr1[1][1] = 15

print(arr1)
print(arr2)

運(yùn)行結(jié)果:

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

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

arr1和arr2是否同一對(duì)象:False

[[ 1  2  3]
 [ 4 15  6]]

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

說(shuō)明:arr2 = arr1.copy()復(fù)制后乏苦,arr2arr1就相互獨(dú)立株扛,一個(gè)數(shù)據(jù)修改不再影響另一個(gè)數(shù)組中的數(shù)據(jù)了。

索引操作

numpy中數(shù)組是矩陣的基礎(chǔ)汇荐,兩種可以相互轉(zhuǎn)化洞就。數(shù)組操作中,索引的處理決定了操作哪些元素掀淘,因此索引操作變得至關(guān)重要旬蟋。
一維數(shù)組,形如arr1=[0, 1, 2, 3, 4]革娄,arr1[1]拿到的是元素1;
一維數(shù)組倾贰,形如

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]

此時(shí)arr1[1]拿到的是第1整行:[ 5 6 7 8 9];
arr1[1][1]拿到的是元素6;
arr1[:, 1]拿到的是第1整列:[ 1 6 11];
arr1[1, 1:3]拿到的是第1行第1~3列的元素:[ 6 7];

方差、標(biāo)準(zhǔn)差

numpy提供了計(jì)算方差拦惋、標(biāo)準(zhǔn)差的函數(shù)匆浙,在統(tǒng)計(jì)計(jì)算時(shí)非常有用:
計(jì)算數(shù)組的極差:np.pth(a)=max(a)-min(a)
計(jì)算方差(總體方差):np.var(a)
標(biāo)準(zhǔn)差:np.std(a)

import numpy as np

arr = np.arange(15).reshape((3, 5))
print(arr)
# 方差
print(np.var(arr))
# 標(biāo)準(zhǔn)差
print(np.std(arr))

運(yùn)行結(jié)果:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
18.666666666666668
4.320493798938574

多項(xiàng)式

多項(xiàng)式擬合:poly= np.polyfit(x,a,n),擬合點(diǎn)集a得到n級(jí)多項(xiàng)式,其中x為橫軸長(zhǎng)度厕妖,返回多項(xiàng)式的系數(shù)
多項(xiàng)式求導(dǎo)函數(shù):np.polyder(poly),返回導(dǎo)函數(shù)的系數(shù)
得到多項(xiàng)式的n階導(dǎo)函數(shù):多項(xiàng)式.deriv(m = n)
多項(xiàng)式求根:np.roots(poly)
多項(xiàng)式在某點(diǎn)上的值:np.polyval(poly,x[n]),返回poly多項(xiàng)式在橫軸點(diǎn)上x[n]上的值
兩個(gè)多項(xiàng)式做差運(yùn)算: np.polysub(a,b)

線性代數(shù)基礎(chǔ)運(yùn)算

估計(jì)線性模型中的系數(shù):a=np.linalg.lstsq(x,b),有b=a*x
求方陣的逆矩陣:np.linalg.inv(A)
求廣義逆矩陣:np.linalg.pinv(A)
求矩陣的行列式:np.linalg.det(A)
解形如AX=b的線性方程組:np.linalg.solve(A,b)
求矩陣的特征值:np.linalg.eigvals(A)
求特征值和特征向量:np.linalg.eig(A)
Svd分解:np.linalg.svd(A)

概率分布

產(chǎn)生二項(xiàng)分布的隨機(jī)數(shù):np.random.binomial(n,p,size=…)首尼,其中n,p,size分別是每輪試驗(yàn)次數(shù)、概率言秸、輪數(shù)
產(chǎn)生超幾何分布隨機(jī)數(shù):np.random.hypergeometric(n1,n2,n,size=…)软能,其中參數(shù)意義分別是物件1總量、物件2總量举畸、每次采樣數(shù)查排、試驗(yàn)次數(shù)
產(chǎn)生N個(gè)正態(tài)分布的隨機(jī)數(shù):np.random.normal(均值,標(biāo)準(zhǔn)差抄沮,N)
產(chǎn)生N個(gè)對(duì)數(shù)正態(tài)分布的隨機(jī)數(shù):np.random.lognormal(mean,sigma,N)

小結(jié)

本文學(xué)習(xí)了numpy的常用用法跋核,具體包括:如何安裝及導(dǎo)入numpy、數(shù)組的重要屬性合是、數(shù)組的多種創(chuàng)建方式了罪、數(shù)組的常見操作、數(shù)組的合并聪全、拆分泊藕;索引操作、多項(xiàng)式、方差娃圆、標(biāo)準(zhǔn)差玫锋、概率分布等知識(shí)。這一節(jié)知識(shí)是后面學(xué)習(xí)PandasTensorFlow的基礎(chǔ)讼呢,務(wù)必掌握撩鹿。

參考資料:NumPy官網(wǎng)教程(英文)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市悦屏,隨后出現(xiàn)的幾起案子节沦,更是在濱河造成了極大的恐慌,老刑警劉巖础爬,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甫贯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡看蚜,警方通過(guò)查閱死者的電腦和手機(jī)叫搁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)供炎,“玉大人渴逻,你說(shuō)我怎么就攤上這事∫艚耄” “怎么了惨奕?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)纽竣。 經(jīng)常有香客問我墓贿,道長(zhǎng),這世上最難降的妖魔是什么蜓氨? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮队伟,結(jié)果婚禮上穴吹,老公的妹妹穿的比我還像新娘。我一直安慰自己嗜侮,他們只是感情好港令,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锈颗,像睡著了一般顷霹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上击吱,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天淋淀,我揣著相機(jī)與錄音,去河邊找鬼覆醇。 笑死朵纷,一個(gè)胖子當(dāng)著我的面吹牛炭臭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袍辞,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼鞋仍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了搅吁?” 一聲冷哼從身側(cè)響起威创,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谎懦,沒想到半個(gè)月后那婉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡党瓮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年详炬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寞奸。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呛谜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枪萄,到底是詐尸還是另有隱情隐岛,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布瓷翻,位于F島的核電站聚凹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏齐帚。R本人自食惡果不足惜妒牙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望对妄。 院中可真熱鬧湘今,春花似錦、人聲如沸剪菱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)孝常。三九已至旗们,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間构灸,已是汗流浹背上渴。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驰贷。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓盛嘿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親括袒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子次兆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353