numpy學(xué)習(xí)(一)

[TOC]

NumPy

numpy 是python語言的一個(gè)擴(kuò)展程序庫, 支持大量的維度數(shù)組與矩陣運(yùn)算, 此外也針對(duì)數(shù)組提供大量的數(shù)學(xué)函數(shù)庫.

numpy是一個(gè)運(yùn)行速度非常快的數(shù)學(xué)庫, 主要用于數(shù)組計(jì)算, 包含:

一個(gè)強(qiáng)大的N維數(shù)組對(duì)象ndarry
廣播功能函數(shù)
整合C/C++/Fortran代碼的工具
線性代數(shù), 傅里葉變換, 隨機(jī)數(shù)生成等功能

numpy應(yīng)用

numpy與scipy(Scientific Python)和 Matplotlib(繪圖庫)一起使用混蔼, 這種組合廣泛用于替代 MatLab零聚,是一個(gè)強(qiáng)大的科學(xué)計(jì)算環(huán)境咳短,有助于我們通過 Python 學(xué)習(xí)數(shù)據(jù)科學(xué)或者機(jī)器學(xué)習(xí)踩晶。

SciPy 是一個(gè)開源的 Python 算法庫和數(shù)學(xué)工具包勋乾。

SciPy 包含的模塊有最優(yōu)化宋下、線性代數(shù)、積分辑莫、插值学歧、特殊函數(shù)、快速傅里葉變換各吨、信號(hào)處理和圖像處理枝笨、常微分方程求解和其他科學(xué)與工程中常用的計(jì)算。

Matplotlib 是 Python 編程語言及其數(shù)值數(shù)學(xué)擴(kuò)展包 NumPy 的可視化操作界面揭蜒。它為利用通用的圖形用戶界面工具包伺帘,如 Tkinter, wxPython, Qt 或 GTK+ 向應(yīng)用程序嵌入式繪圖提供了應(yīng)用程序接口(API)。

numpy 安裝

  1. 使用已經(jīng)集成了這些模塊的開發(fā)工具如Anaconda, Enthought Canopy, Python(x,y), WinPython, Pyzo

  2. 使用pip來安裝

    python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
    

    --user 選項(xiàng)可以設(shè)置只安裝在當(dāng)前的用戶下, 而不是寫入到系統(tǒng)目錄

linux下安裝

ubuntu&debian

sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose

centos& Fedora

sudo dnf install numpy scipy python-matplotlib ipython python-pandas sympy python-nose atlas-devel

mac:

python -m pip install numpy scipy matplotlib

安裝驗(yàn)證

>>> from nummpy import *
>>> eye(4)
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])

eye(4)生成對(duì)角矩陣

numpy Ndarray 對(duì)象

NumPy 最重要的一個(gè)特點(diǎn)是其 N 維數(shù)組對(duì)象 ndarray忌锯,它是一系列同類型數(shù)據(jù)的集合伪嫁,以 0 下標(biāo)為開始進(jìn)行集合中元素的索引。

ndarray 對(duì)象是用于存放同類型元素的多維數(shù)組偶垮。

ndarray 中的每個(gè)元素在內(nèi)存中都有相同存儲(chǔ)大小的區(qū)域张咳。

ndarray 內(nèi)部由以下內(nèi)容組成:

1.一個(gè)指向數(shù)據(jù)(內(nèi)存或內(nèi)存映射文件中的一塊數(shù)據(jù))的指針
2.數(shù)據(jù)類型或dtype, 描述在數(shù)組中的固定大小值的格子
3.一個(gè)表示數(shù)組形狀(shape)的元組, 表示各維度大小的元組
4.一個(gè)跨度元組(stride), 其中的整數(shù)指的是為了前進(jìn)到當(dāng)前維度下一個(gè)元素需要"跨過"的字節(jié)數(shù).

ndarray內(nèi)部結(jié)構(gòu):

內(nèi)部結(jié)構(gòu)

跨度可以是負(fù)數(shù), 這樣會(huì)使數(shù)組在內(nèi)存中向后移動(dòng), 切片中obj[::-1]obj[:,::-1]就是如此.

創(chuàng)建一個(gè)ndarray只需要調(diào)用Numpy的array函數(shù)即可:

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
名稱 描述
object 數(shù)組或嵌套的數(shù)列
dtype 數(shù)組元素的數(shù)據(jù)類型, 可選
copy 對(duì)象是否需要復(fù)制, 可選
order 創(chuàng)建數(shù)組的樣式, C為行方向, F為列方向, A為任意方向(默認(rèn))
subok 默認(rèn)返回一個(gè)與基類類型一致的數(shù)組
ndmin 指生成數(shù)的最小維度

實(shí)例

import numpy

a = numpy.array([1,2,3])
print (a)

輸出:
[1 2 3]

實(shí)例2:

# 多于一個(gè)維度, 兩個(gè)數(shù)組
import numpy

a = numpy.array([[1,2,3], [4,5]])
print (a)
[[1, 2, 3] [4, 5]]
[Finished in 0.1s]

實(shí)例3:

# 最小維度
import numpy
a = numpy.array([1,2,3,4,5],ndmin = 2)
print (a)

輸出:
[[1 2 3 4 5]]
[Finished in 0.1s]

實(shí)例4:

# dtype 參數(shù)
import numpy
a = numpy.array([1,2,3,4,5], dtype = complex)
print (a)

輸出:

[ 1.+0.j  2.+0.j  3.+0.j  4.+0.j  5.+0.j]
[Finished in 0.1s]

ndarray對(duì)象由計(jì)算機(jī)內(nèi)存的連續(xù)一維部分組成, 并結(jié)合索引模式, 將每個(gè)元素映射到內(nèi)存塊中的一個(gè)位置. 內(nèi)存塊一行順序(C樣式)或列順序(FORTRAN或Matlab風(fēng)格, 即F樣式)來保存元素

numpy數(shù)據(jù)類型

numpy支持的數(shù)據(jù)類型比python內(nèi)置的類型要多很多, 基本上可以和C語言的數(shù)據(jù)類型對(duì)應(yīng)上, 其中部分類型對(duì)應(yīng)為Python內(nèi)置的類型.

常用基本類型:

名稱 描述
bool_ 布爾型數(shù)據(jù)類型(True 或者 False)
int_ 默認(rèn)的整數(shù)類型(類似于 C 語言中的 long,int32 或 int64)
intc 與 C 的 int 類型一樣似舵,一般是 int32 或 int 64
intp 用于索引的整數(shù)類型(類似于 C 的 ssize_t脚猾,一般情況下仍然是 int32 或 int64)
int8 字節(jié)(-128 to 127)
int16 整數(shù)(-32768 to 32767)
int32 整數(shù)(-2147483648 to 2147483647)
int64 整數(shù)(-9223372036854775808 to 9223372036854775807)
uint8 無符號(hào)整數(shù)(0 to 255)
uint16 無符號(hào)整數(shù)(0 to 65535)
uint32 無符號(hào)整數(shù)(0 to 4294967295)
uint64 無符號(hào)整數(shù)(0 to 18446744073709551615)
float_ float64 類型的簡(jiǎn)寫
float16 半精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位砚哗,5 個(gè)指數(shù)位龙助,10 個(gè)尾數(shù)位
float32 單精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位蛛芥,8 個(gè)指數(shù)位提鸟,23 個(gè)尾數(shù)位
float64 雙精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位仅淑,11 個(gè)指數(shù)位称勋,52 個(gè)尾數(shù)位
complex_ complex128 類型的簡(jiǎn)寫,即 128 位復(fù)數(shù)
complex64 復(fù)數(shù)涯竟,表示雙 32 位浮點(diǎn)數(shù)(實(shí)數(shù)部分和虛數(shù)部分)
complex128 復(fù)數(shù)赡鲜,表示雙 64 位浮點(diǎn)數(shù)(實(shí)數(shù)部分和虛數(shù)部分)

numpy的數(shù)值類型實(shí)際上是dtype對(duì)象的實(shí)例, 并對(duì)應(yīng)唯一的字符, 包括np.bool_. np.int32, np.float32 , 等等

數(shù)據(jù)類型對(duì)象(dtype)

數(shù)據(jù)類型對(duì)象是用來描述與數(shù)組對(duì)應(yīng)的內(nèi)存區(qū)域如何使用, 這依賴如下幾個(gè)方面:

  • 數(shù)據(jù)類型(整數(shù), 浮點(diǎn)數(shù)或者python對(duì)象)
  • 數(shù)據(jù)的大小(列如, 整數(shù)使用多少個(gè)字節(jié)存儲(chǔ))
  • 數(shù)據(jù)的字節(jié)順序(小端法或大端法)
  • 在結(jié)構(gòu)化類型的情況下, 字段的名稱, 每個(gè)字段的數(shù)據(jù)類型和每個(gè)字段所取的內(nèi)存塊的部分
  • 如果數(shù)據(jù) 類型是子數(shù)組, 他的形狀和數(shù)據(jù)類型

字節(jié)順序是通過對(duì)數(shù)據(jù)類型預(yù)先設(shè)定"<"或">"來決定的. "<"意味著小端法(最小值存儲(chǔ)在最小的地址, 即低位組放在最前面). ">"意味著大端法(最重要的字節(jié)存儲(chǔ)在最小的地址, 即高位組放在最前面).

dtype對(duì)象是使用以下語法構(gòu)造的:

numpy.dtype(object, align, copy)

object: 要轉(zhuǎn)換為的數(shù)據(jù)類型對(duì)象

align: 如果為true, 填充字段使其類似C的結(jié)構(gòu)體

copy: 復(fù)制dtype對(duì)象, 如果為false, 則是對(duì)內(nèi)置數(shù)據(jù)類型對(duì)象的引用

實(shí)例

import numpy
# 使用標(biāo)量類型
a = numpy.dtype(numpy.int32)
print (a)

輸出:

int32
[Finished in 0.1s]

實(shí)例2:

# int8, int16, int32, int64 四種數(shù)據(jù)類型可以使用字符串 'i1', 'i2','i4','i8' 代替
import numpy
a = numpy.dtype('i4')
print (a)

輸出:

int32
[Finished in 0.1s]

實(shí)例3:

import numpy
# 字節(jié)順序標(biāo)注
a = numpy.dtype('<i4')
print (a)

輸出:
    int32

結(jié)構(gòu)化數(shù)據(jù)類型的使用, 類型字段和對(duì)應(yīng)的實(shí)際類型將被創(chuàng)建.

實(shí)例4:

import numpy
a = numpy.dtype([('age', numpy.int8)])
print (a)
[('age', 'i1')]
[Finished in 0.1s]

實(shí)例5:

import numpy
# 數(shù)據(jù)類型應(yīng)用到ndarray對(duì)象
dt = numpy.dtype([('age', numpy.int8)])
a = numpy.array([(10,),(20,),(30,)], dtype = dt)
print (a)
[(10,) (20,) (30,)]
[Finished in 0.1s]

實(shí)例6:

# 類型字段名可以用于存取實(shí)際的age列
import numpy
dt = numpy.dtype([('age', numpy.int8)])
a = numpy.array([(10,),(20,),(30,)], dtype = dt)
print (a['age'])
[10 20 30]
[Finished in 0.1s]

下面的示例定義一個(gè)結(jié)構(gòu)化數(shù)據(jù)類型 student空厌,包含字符串字段 name,整數(shù)字段 age银酬,及浮點(diǎn)字段 marks嘲更,并將這個(gè) dtype 應(yīng)用到 ndarray 對(duì)象

實(shí)例7:

import numpy
student = numpy.dtype([('name','S20'),('age','i1'),('marks','f4')])
print (student)
[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]
[Finished in 0.1s]

實(shí)例8:

import numpy
student = numpy.dtype([('name','S20'),('age','i1'),('marks','f4')])
a = numpy.array([('abc', 21,50),('xyz', 18, 75)], dtype = student)
print (a)
[(b'abc', 21,  50.) (b'xyz', 18,  75.)]
[Finished in 0.1s]

dtype相當(dāng)于提前定義的一張數(shù)據(jù)表里面各個(gè)字段的 名字 數(shù)據(jù)類型, numpy.array()按照提前定義的字段, 依次填入進(jìn)去. 注意python2和3的區(qū)別.

每個(gè)內(nèi)建類型都已一個(gè)唯一定義它的字符代碼如下:

字符 對(duì)應(yīng)類型
b 布爾型
i (有符號(hào)) 整型
u 無符號(hào)整型 integer
f 浮點(diǎn)型
c 復(fù)數(shù)浮點(diǎn)型
m timedelta(時(shí)間間隔)
M datetime(日期時(shí)間)
O (Python) 對(duì)象
S, a (byte-)字符串
U Unicode
V 原始數(shù)據(jù) (void)

numpy數(shù)組屬性

NumPy 數(shù)組的維數(shù)稱為秩(rank),秩就是軸的數(shù)量揩瞪,即數(shù)組的維度赋朦,一維數(shù)組的秩為 1,二維數(shù)組的秩為 2壮韭,以此類推北发。

在 NumPy中纹因,每一個(gè)線性的數(shù)組稱為是一個(gè)軸(axis)喷屋,也就是維度(dimensions)。比如說瞭恰,二維數(shù)組相當(dāng)于是兩個(gè)一維數(shù)組屯曹,其中第一個(gè)一維數(shù)組中每個(gè)元素又是一個(gè)一維數(shù)組。所以一維數(shù)組就是 NumPy 中的軸(axis)惊畏,第一個(gè)軸相當(dāng)于是底層數(shù)組恶耽,第二個(gè)軸是底層數(shù)組里的數(shù)組。而軸的數(shù)量——秩颜启,就是數(shù)組的維數(shù)偷俭。

很多時(shí)候可以聲明 axis。axis=0缰盏,表示沿著第 0 軸進(jìn)行操作涌萤,即對(duì)每一列進(jìn)行操作;axis=1口猜,表示沿著第1軸進(jìn)行操作负溪,即對(duì)每一行進(jìn)行操作。

NumPy 的數(shù)組中比較重要 ndarray 對(duì)象屬性有:

屬性 說明
ndarray.ndim 秩蛀序,即軸的數(shù)量或維度的數(shù)量
ndarray.shape 數(shù)組的維度若未,對(duì)于矩陣较曼,n 行 m 列
ndarray.size 數(shù)組元素的總個(gè)數(shù),相當(dāng)于 .shape 中 n*m 的值
ndarray.dtype ndarray 對(duì)象的元素類型
ndarray.itemsize ndarray 對(duì)象中每個(gè)元素的大小崖堤,以字節(jié)為單位
ndarray.flags ndarray 對(duì)象的內(nèi)存信息
ndarray.real ndarray元素的實(shí)部
ndarray.imag ndarray 元素的虛部
ndarray.data 包含實(shí)際數(shù)組元素的緩沖區(qū),由于一般通過數(shù)組的索引獲取元素耐床,所以通常不需要使用這個(gè)屬性倘感。

ndarray.ndim

返回?cái)?shù)組的維數(shù)等于秩

import numpy
a = numpy.arange(24)
print (a.ndim) # a現(xiàn)只有一個(gè)維度 
# 現(xiàn)在調(diào)整其大小
b = a.reshape(2,4,3) # b現(xiàn)在擁有3個(gè)維度
print (b.ndim)
1
3

ndarray.shape

ndarray.shape 表示數(shù)組的維度,返回一個(gè)元組咙咽,這個(gè)元組的長(zhǎng)度就是維度的數(shù)目老玛,即 ndim 屬性(秩)。比如,一個(gè)二維數(shù)組蜡豹,其維度表示"行數(shù)"和"列數(shù)"麸粮。

ndarray.shape 也可以用于調(diào)整數(shù)組大小。

實(shí)例:
import numpy 
a = numpy.array([[1,2,3],[4,5,6]])
print (a.shape) # 二行三列

(2, 3)
[Finished in 0.1s]

調(diào)整大小:

import numpy 
a = numpy.array([[1,2,3],[4,5,6]])
a.shape = (3,2) # 三行二列
print (a)
[[1 2]
 [3 4]
 [5 6]]
[Finished in 0.1s]

numpy也提供了reshape函數(shù)來調(diào)整數(shù)組大小.

import numpy
a  = numpy.array([[1,2,3],[4,5,6]])
b  = a.reshape(3,2)
print (b)
[[1 2]
 [3 4]
 [5 6]]
[Finished in 0.3s]

ndarray.itemsize

ndarray.itemsize 以字節(jié)的形式返回?cái)?shù)組中每一個(gè)元素的大小镜廉。

例如弄诲,一個(gè)元素類型為 float64 的數(shù)組 itemsiz 屬性值為 8(float64 占用 64 個(gè) bits,每個(gè)字節(jié)長(zhǎng)度為 8娇唯,所以 64/8齐遵,占用 8 個(gè)字節(jié)),又如塔插,一個(gè)元素類型為 complex32 的數(shù)組 item 屬性為 4(32/8)梗摇。

實(shí)例:

import numpy
# 數(shù)組的dtype為int8(一個(gè)字節(jié))
a = numpy.array([1,99,2,3,4,5], dtype = numpy.int8)
print (a.itemsize)

# 數(shù)組的dtype現(xiàn)在為float64(8個(gè)字節(jié))
b = numpy.array([1,2,3,4,5], dtype = numpy.float64)
print (b.itemsize)

1
8

ndarray.flags

ndarray.flags 返回ndarray對(duì)象的內(nèi)存信息, 包含以下屬性.

屬性 描述
C_CONTIGUOUS (C) 數(shù)據(jù)是在一個(gè)單一的C風(fēng)格的連續(xù)段中
F_CONTIGUOUS (F) 數(shù)據(jù)是在一個(gè)單一的Fortran風(fēng)格的連續(xù)段中
OWNDATA (O) 數(shù)組擁有它所使用的內(nèi)存或從另一個(gè)對(duì)象中借用它
WRITEABLE (W) 數(shù)據(jù)區(qū)域可以被寫入,將該值設(shè)置為 False想许,則數(shù)據(jù)為只讀
ALIGNED (A) 數(shù)據(jù)和所有元素都適當(dāng)?shù)貙?duì)齊到硬件上
UPDATEIFCOPY (U) 這個(gè)數(shù)組是其它數(shù)組的一個(gè)副本伶授,當(dāng)這個(gè)數(shù)組被釋放時(shí),原數(shù)組的內(nèi)容將被更新
import numpy
a = numpy.array([1,2,33])
print (a.flags)
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
[Finished in 0.1s]

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

ndarray數(shù)組除了可以使用底層ndarray構(gòu)造器來創(chuàng)建外, 也可以通過以下幾種方式來創(chuàng)建.

numpy.empty

numpy.empty 方法用來創(chuàng)建一個(gè)指定形狀(shape), 數(shù)據(jù)類型(dtype)且未初始化的數(shù)組:

numpy.empty(shape, dtype = float, order = 'C')
參數(shù) 描述
shape 數(shù)組形狀
dtype 數(shù)據(jù)類型流纹,可選
order 有"C"和"F"兩個(gè)選項(xiàng),分別代表糜烹,行優(yōu)先和列優(yōu)先,在計(jì)算機(jī)內(nèi)存中的存儲(chǔ)元素的順序漱凝。
import numpy
a = numpy.empty([3,2], dtype = int)
print (a)

[[    140605049899912     140605049899912]
 [    140605009638320     140605009626224]
 [7205759936368964608   72483105062780931]]
[Finished in 0.1s]

數(shù)組元素為隨機(jī)值, 因?yàn)樗麄冞€未初始化

numpy.zeros

創(chuàng)建指定大小的數(shù)組, 數(shù)組元素以0 來填充.

numpy.zeros(shape, dtype = float, order = 'C')

參數(shù)說明:

參數(shù) 描述
shape 數(shù)組形狀
dtype 數(shù)據(jù)類型疮蹦,可選
order 'C' 用于 C 的行數(shù)組,或者 'F' 用于 FORTRAN 的列數(shù)組
import numpy

# 默認(rèn)為浮點(diǎn)數(shù)
a  = numpy.zeros(5)
print (a)

# 設(shè)置類型為整數(shù)
b  = numpy.zeros((5,),dtype = numpy.int)
print (b)

# 自定義類型
c = numpy.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])
print (c)

[ 0.  0.  0.  0.  0.]
[0 0 0 0 0]
[[(0, 0) (0, 0)]
 [(0, 0) (0, 0)]]
[Finished in 0.1s]

numpy.ones

創(chuàng)建指定形狀的數(shù)組, 數(shù)組元素以1來填充:

numpy.ones(shape, dtype = None, order = 'C')

參數(shù)解釋:

參數(shù) 描述
shape 數(shù)組形狀
dtype 數(shù)據(jù)類型茸炒,可選
order 'C' 用于 C 的行數(shù)組愕乎,或者 'F' 用于 FORTRAN 的列數(shù)組

實(shí)例:

import numpy
# 默認(rèn)為浮點(diǎn)數(shù)
a = numpy.ones(5)
print (a)
# 自定義類型
b = numpy.ones([3,3], dtype = [('x', int),('y', float)])
print (b)
[ 1.  1.  1.  1.  1.]
[[(1,  1.) (1,  1.) (1,  1.)]
 [(1,  1.) (1,  1.) (1,  1.)]
 [(1,  1.) (1,  1.) (1,  1.)]]
[Finished in 0.1s]

從已有數(shù)組創(chuàng)建數(shù)組

numpy.asarray

numpy.asarray 類似 numpy.array, 但 numpy.asarray 參數(shù)有三個(gè), 比numpy.array少兩個(gè)

numpy.asarray(a, dtype = None, order = None)

參數(shù)說明:

參數(shù) 描述
a 任意形式的輸入?yún)?shù),可以是扣典,列表, 列表的元組, 元組, 元組的元組, 元組的列表妆毕,多維數(shù)組
dtype 數(shù)據(jù)類型,可選
order 可選贮尖,有"C"和"F"兩個(gè)選項(xiàng),分別代表笛粘,行優(yōu)先和列優(yōu)先,在計(jì)算機(jī)內(nèi)存中的存儲(chǔ)元素的順序湿硝。

實(shí)例:

列表裝換為ndarray:

import numpy
x  = [1,2,3]
a = numpy.asarray(x)
print (a)


[1 2 3]
[Finished in 0.1s]

元組轉(zhuǎn)換為ndarray:

import numpy
x  = (1,2,3)
a = numpy.asarray(x)
print (a)

[1 2 3]

元組列表轉(zhuǎn)換為ndarray:

import numpy
x  = [(1,2,3),(4,5)]
a = numpy.asarray(x)
print (a)

[(1, 2, 3) (4, 5)]
[Finished in 0.1s]

加上dtype參數(shù):

import numpy
x  = [1,2,3,4,5]
a = numpy.asarray(x, dtype = float)
print (a)

[ 1.  2.  3.  4.  5.]
[Finished in 0.1s]

numpy.frombuffer

numpy.frombuffer 用于實(shí)現(xiàn)動(dòng)態(tài)數(shù)組, numpy.frombuffer接受buffer輸入?yún)?shù), 以流的形式讀入轉(zhuǎn)化成ndarray對(duì)象.

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

注: buffer是字符串的時(shí)候, python3 默認(rèn)str是unicode類型, 所以要轉(zhuǎn)換成bytestring在原str前加上b

參數(shù)說明:

參數(shù) 描述
buffer 可以是任意對(duì)象薪前,會(huì)以流的形式讀入。
dtype 返回?cái)?shù)組的數(shù)據(jù)類型关斜,可選
count 讀取的數(shù)據(jù)數(shù)量示括,默認(rèn)為-1,讀取所有數(shù)據(jù)痢畜。
offset 讀取的起始位置垛膝,默認(rèn)為0鳍侣。

python3:

import numpy
s = b'hello word'
a = numpy.frombuffer(s, dtype = 'S1')
print (a)

[b'h' b'e' b'l' b'l' b'o' b' ' b'w' b'o' b'r' b'd']
[Finished in 0.1s]

python2:

import numpy

s = 'hello word'
a = numpy.frombuffer(s, dtype = 'S1')
print (a)


pig@deep:~/Desktop/note/python/numpy$ python test.py 
['h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' 'd']

numpy.fromiter

numpy.fromiter 方法從可迭代對(duì)象中建立ndarray 對(duì)象, 返回一維數(shù)組

numpy.fromiter(iterable, dtype, count = -1)
參數(shù) 描述
iterable 可迭代對(duì)象
dtype 返回?cái)?shù)組的數(shù)據(jù)類型
count 讀取的數(shù)據(jù)數(shù)量,默認(rèn)為-1吼拥,讀取所有數(shù)據(jù)
import numpy
# 使用range函數(shù)創(chuàng)建列表對(duì)象
list = range(5)
it = iter(list)
# 使用迭代器創(chuàng)建 ndarray
a = numpy.fromiter(it, dtype = float)
print (a)

[ 0.  1.  2.  3.  4.]
[Finished in 0.1s]

numpy從數(shù)值范圍創(chuàng)建數(shù)組

numpy.arange

numpy 包中的使用arange函數(shù)創(chuàng)建數(shù)值范圍并返回ndarray對(duì)象, 函數(shù)格式如下:

numpy.arange(start, stop, step, dtype)

根據(jù)start與stop指定的范圍以及step設(shè)定的步長(zhǎng), 生成一個(gè)ndarray

參數(shù)說明:

參數(shù) 描述
start 起始值倚聚,默認(rèn)為0
stop 終止值(不包含)
step 步長(zhǎng),默認(rèn)為1
dtype 返回ndarray的數(shù)據(jù)類型凿可,如果沒有提供惑折,則會(huì)使用輸入數(shù)據(jù)的類型。

實(shí)例:

生成0-5的數(shù)組

import numpy
a = numpy.arange(5, dtype = float)
print (a)


[ 0.  1.  2.  3.  4.]
[Finished in 0.1s]

設(shè)置起始值, 終止值及步長(zhǎng):

import numpy
a = numpy.arange(10,20,2, dtype = float)
print (a)

[ 10.  12.  14.  16.  18.]
[Finished in 0.1s]

numpy.linspace

numpy.linspace函數(shù)用于創(chuàng)建一個(gè)一維數(shù)組, 數(shù)組是一個(gè)等差數(shù)列構(gòu)成的, 格式如下:

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

參數(shù)說明:

參數(shù) 描述
start 序列的起始值
stop 序列的終止值枯跑,如果endpointtrue惨驶,該值包含于數(shù)列中
num 要生成的等步長(zhǎng)的樣本數(shù)量,默認(rèn)為50
endpoint 該值為 true 時(shí)敛助,數(shù)列中中包含stop值粗卜,反之不包含,默認(rèn)是True辜腺。
retstep 如果為 True 時(shí)休建,生成的數(shù)組中會(huì)顯示間距乍恐,反之不顯示评疗。
dtype ndarray 的數(shù)據(jù)類型

實(shí)例:

設(shè)置起始點(diǎn)為1, 終止點(diǎn)為10, 數(shù)列個(gè)數(shù)為10

import numpy
a = numpy.linspace(1,10,10, dtype = float)
print (a)

[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.]
[Finished in 0.1s]

設(shè)置元素為1的等差數(shù)列:

import numpy
a = numpy.linspace(1,1,10, dtype = float)
print (a)

[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
[Finished in 0.1s]

將endpoint設(shè)為false, 不包含終止值;

import numpy
a = numpy.linspace(10,20,5,endpoint = False, dtype = float)
print (a)


[ 10.  12.  14.  16.  18.]
[Finished in 0.1s]

如果將endpoint 設(shè)為true, 則會(huì)包含20.

以下實(shí)例設(shè)置間距:

import numpy
a = numpy.linspace(1,10,10,retstep = True)
print (a)
# 拓展列子
b = numpy.linspace(1,10,10).reshape([10,1])
print (b)
(array([  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.]), 1.0)
[[  1.]
 [  2.]
 [  3.]
 [  4.]
 [  5.]
 [  6.]
 [  7.]
 [  8.]
 [  9.]
 [ 10.]]
[Finished in 0.1s]

numpy.logspace

numpy.logspace函數(shù)用于創(chuàng)建一個(gè)等比數(shù)列格式如下:

numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

base參數(shù)意思是取對(duì)數(shù)的時(shí)候log的下標(biāo)

參數(shù) 描述
start 序列的起始值為:base ** start
stop 序列的終止值為:base ** stop。如果endpointtrue茵烈,該值包含于數(shù)列中
num 要生成的等步長(zhǎng)的樣本數(shù)量百匆,默認(rèn)為50
endpoint 該值為 true 時(shí),數(shù)列中中包含stop值呜投,反之不包含加匈,默認(rèn)是True。
base 對(duì)數(shù) log 的底數(shù)仑荐。
dtype ndarray 的數(shù)據(jù)類型
import numpy
# 默認(rèn)底數(shù)是10
a = numpy.logspace(1.0, 2.0, num=10)
print (a)

[  10.           12.91549665   16.68100537   21.5443469    27.82559402
   35.93813664   46.41588834   59.94842503   77.42636827  100.        ]
[Finished in 0.1s]
import numpy
# 底數(shù)是2
a = numpy.logspace(0, 9,10, base=2)
print (a)


[   1.    2.    4.    8.   16.   32.   64.  128.  256.  512.]
[Finished in 0.1s]

numpy切片和索引

ndarray對(duì)象的內(nèi)容可以通過索引或切片來訪問和修改雕拼,與 Python 中 list 的切片操作一樣。

ndarray 數(shù)組可以基于 0 - n 的下標(biāo)進(jìn)行索引粘招,切片對(duì)象可以通過內(nèi)置的 slice 函數(shù)啥寇,并設(shè)置 start, stop 及 step 參數(shù)進(jìn)行,從原數(shù)組中切割出一個(gè)新數(shù)組洒扎。

>>> import numpy
>>> a = numpy.arange(10)
>>> s = slice(2,7,2) # 從索引2 開始索引到7停止, 間隔為2
>>> print (a[s])
[2 4 6]

通過arange()函數(shù)創(chuàng)建ndarray對(duì)象, 然后, 分別設(shè)置起始, 終止和步長(zhǎng)的參數(shù)為2, 7 和2.

也可以通過冒號(hào)分割切片參數(shù)start:stop:step來進(jìn)行切片操作:

>>> import numpy
>>> a = numpy.arange(10)
>>> b = a[2:7:2]
>>> print (b)
[2 4 6]
>>> 

索引和list中的索引差不多 單個(gè)參數(shù)[2] , [2:]索引開始后面的所有項(xiàng)都將提取,如果[2:7] 則提取兩個(gè)索引之間的項(xiàng)(不包括停止索引)

多維數(shù)組同樣適用上述索引提取方法:

>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
>>> print (a)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
>>> print (a[1:])
[[4 5 6]
 [7 8 9]]
>>> 

切片還可以包括省略號(hào)...來使選擇元組的長(zhǎng)度與數(shù)組的維度相同, 如果在行位置使用省略號(hào), 他將返回包含行中元素的ndarray

>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
>>> print (a[...,1]) # 第二列元素
[2 5 8]
>>> print (a[1,...]) # 第二行元素
[4 5 6]
>>> print (a[...,1:]) # 第二例及剩下的所有元素
[[2 3]
 [5 6]
 [8 9]]
>>> 

numpy 高級(jí)索引

NumPy 比一般的 Python 序列提供更多的索引方式辑甜。除了之前看到的用整數(shù)和切片的索引外,數(shù)組可以由整數(shù)數(shù)組索引袍冷、布爾索引及花式索引磷醋。

整數(shù)數(shù)組索引

以下實(shí)例獲取數(shù)組中(0,0),(1,1)和(2,0)位置處的元素胡诗。

import numpy
x = numpy.array([[1,2],[3,4],[5,6]])
y = x[[0,1,2], [0,1,0]]
print (y)


[1 4 5]
[Finished in 0.1s]
區(qū)別:
import numpy
x = numpy.array([[1,2],[3,4],[5,6]])
y = x[[0,1], [0,1]]
print (y)
print (x)

[1 4]
[[1 2]
 [3 4]
 [5 6]]
[Finished in 0.1s]

獲取4x3數(shù)組中的四個(gè)角元素, 行索引為[0,0]和[3,3] 而列索引為[0,2]和[0,2]

import numpy
x = numpy.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print ('數(shù)組:')
print (x)
print ('\n')
rows = numpy.array([[0,0],[3,3]])
cols = numpy.array([[0,2],[0,2]])
y = x[rows, cols]
print ('角上的四個(gè)元素:')
print (y)

坐標(biāo)為00 02 30 32
數(shù)組:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


角上的四個(gè)元素:
[[ 0  2]
 [ 9 11]]
[Finished in 0.1s]

返回結(jié)果是包含每個(gè)角元素的ndarray對(duì)象

可以借助切片:...與索引數(shù)組組合

import numpy
a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
b = a[1:3,1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print (a)
print (b)
print (c)
print (d)

[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[5 6]
 [8 9]]
[[5 6]
 [8 9]]
[[2 3]
 [5 6]
 [8 9]]
[Finished in 0.1s]

要獲取元素 的行索引集合, 列索引集合來獲取元素, 如果是獲取某個(gè)區(qū)域的元素, 則使用:

布爾索引

我們可以通過一個(gè)布爾數(shù)組來索引目標(biāo)數(shù)組邓线。

布爾索引通過布爾運(yùn)算(如:比較運(yùn)算符)來獲取符合指定條件的元素的數(shù)組淌友。

以下實(shí)例獲取大于 5 的元素:

import numpy as np 
 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我們的數(shù)組是:')
print (x)
print ('\n')
# 現(xiàn)在我們會(huì)打印出大于 5 的元素  
print  ('大于 5 的元素是:')
print (x[x >  5])

我們的數(shù)組是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


大于 5 的元素是:
[ 6  7  8  9 10 11]
[Finished in 0.3s]

以下使用~(取補(bǔ)運(yùn)算符) 來過濾NaN

import numpy 
a = numpy.array([numpy.nan, 1, 2, numpy.nan, 3, 4, 5])
print (a[~numpy.isnan(a)])

[ 1.  2.  3.  4.  5.]
[Finished in 0.1s]

從數(shù)組中過濾掉非復(fù)數(shù)元素:

import numpy 
a = numpy.array([1, 2+6j,5,3.5])
print (a[numpy.iscomplex(a)])

[ 2.+6.j]
[Finished in 0.1s]

花式索引

花式索引指的是利用整數(shù)數(shù)組進(jìn)行索引。

花式索引根據(jù)索引數(shù)組的值作為目標(biāo)數(shù)組的某個(gè)軸的下標(biāo)來取值骇陈。對(duì)于使用一維整型數(shù)組作為索引亩进,如果目標(biāo)是一維數(shù)組,那么索引的結(jié)果就是對(duì)應(yīng)位置的元素缩歪;如果目標(biāo)是二維數(shù)組归薛,那么就是對(duì)應(yīng)下標(biāo)的行。

花式索引跟切片不一樣匪蝙,它總是將數(shù)據(jù)復(fù)制到新數(shù)組中主籍。

  1. 傳入順序索引數(shù)組

    import numpy 
    a = numpy.arange(32)
    x = a.reshape((8,4))
    print (a)
    print (x)
    print (x[[4,2,1,7]])
    
    
    [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
     25 26 27 28 29 30 31]
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]
     [12 13 14 15]
     [16 17 18 19]
     [20 21 22 23]
     [24 25 26 27]
     [28 29 30 31]]
    [[16 17 18 19]
     [ 8  9 10 11]
     [ 4  5  6  7]
     [28 29 30 31]]
    [Finished in 0.1s]
    
  2. 傳入倒敘索引數(shù)組

import numpy 
a = numpy.arange(32)
x = a.reshape((8,4))
print (a)
print (x)
print (x[[-4,-2,-1,-7]])


[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 25 26 27 28 29 30 31]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
[[16 17 18 19]
 [24 25 26 27]
 [28 29 30 31]
 [ 4  5  6  7]]
[Finished in 0.1s]
  1. 傳入多個(gè)索引數(shù)組(要使用np.ix_)
import numpy 
a = numpy.arange(32)
x = a.reshape((8,4))
print (x)
print (x[numpy.ix_([1,5,7,2],[0,3,1,2])])

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]
[Finished in 0.1s]

行索引配合列索引

numpy廣播(broadcast)

廣播(Broadcast)是 numpy 對(duì)不同形狀(shape)的數(shù)組進(jìn)行數(shù)值計(jì)算的方式, 對(duì)數(shù)組的算術(shù)運(yùn)算通常在相應(yīng)的元素上進(jìn)行逛球。

如果兩個(gè)數(shù)組 a 和 b 形狀相同千元,即滿足 a.shape == b.shape,那么 a*b 的結(jié)果就是 a 與 b 數(shù)組對(duì)應(yīng)位相乘颤绕。這要求維數(shù)相同幸海,且各維度的長(zhǎng)度相同。

[1,2,3,4] * [10,20,30,40]

import numpy 
a = numpy.array([1,2,3,4])
b = numpy.array([10,20,30,40])
c = a * b
print (c)

[ 10  40  90 160]
[Finished in 0.1s]

當(dāng)運(yùn)算中的兩個(gè)數(shù)組形狀不同時(shí), numpy將自動(dòng)觸發(fā)廣播機(jī)制.:

import numpy 
a  = numpy.array([[0,0,0],
    [10,10,10],
    [20,20,20],
    [30,30,30]])
b = numpy.array([1,2,3])
print (a + b)

[[ 1  2  3]
 [11 12 13]
 [21 22 23]
 [31 32 33]]
[Finished in 0.1s]

廣播的規(guī)則:

  • 讓所有輸入數(shù)組都向其中形狀最長(zhǎng)的數(shù)組看齊奥务,形狀中不足的部分都通過在前面加 1 補(bǔ)齊物独。
  • 輸出數(shù)組的形狀是輸入數(shù)組形狀的各個(gè)維度上的最大值。
  • 如果輸入數(shù)組的某個(gè)維度和輸出數(shù)組的對(duì)應(yīng)維度的長(zhǎng)度相同或者其長(zhǎng)度為 1 時(shí)氯葬,這個(gè)數(shù)組能夠用來計(jì)算挡篓,否則出錯(cuò)。
  • 當(dāng)輸入數(shù)組的某個(gè)維度的長(zhǎng)度為 1 時(shí)帚称,沿著此維度運(yùn)算時(shí)都用此維度上的第一組值官研。

簡(jiǎn)單理解:對(duì)兩個(gè)數(shù)組,分別比較他們的每一個(gè)維度(若其中一個(gè)數(shù)組沒有當(dāng)前維度則忽略)闯睹,滿足:

  • 數(shù)組擁有相同形狀戏羽。
  • 當(dāng)前維度的值相等。
  • 當(dāng)前維度的值有一個(gè)是 1楼吃。

若條件不滿足始花,拋出 "ValueError: frames are not aligned" 異常。

tile()函數(shù)就是將原矩陣橫向, 縱向的復(fù)制.

tile(mat, (1,4)) 復(fù)制為原來的四倍

numpy 迭代數(shù)組

NumPy 迭代器對(duì)象 numpy.nditer 提供了一種靈活訪問一個(gè)或者多個(gè)數(shù)組元素的方式所刀。

迭代器最基本的任務(wù)的可以完成對(duì)數(shù)組元素的訪問衙荐。

接下來我們使用 arange() 函數(shù)創(chuàng)建一個(gè) 2X3 數(shù)組,并使用 nditer 對(duì)它進(jìn)行迭代浮创。

import numpy as np 
a = np.arange(6).reshape(2,3)
print ('原數(shù)組:')
print (a)
print ('\n')
for x in np.nditer(a):
    print (x, end=', ')
print ('\n')

原數(shù)組:
[[0 1 2]
 [3 4 5]]


0, 1, 2, 3, 4, 5, 

[Finished in 0.1s]

以上實(shí)例不是使用標(biāo)準(zhǔn) C 或者 Fortran 順序忧吟,選擇的順序是和數(shù)組內(nèi)存布局一致的,這樣做是為了提升訪問的效率斩披,默認(rèn)是行序優(yōu)先(row-major order溜族,或者說是 C-order)讹俊。

這反映了默認(rèn)情況下只需訪問每個(gè)元素,而無需考慮其特定順序煌抒。我們可以通過迭代上述數(shù)組的轉(zhuǎn)置來看到這一點(diǎn)仍劈,并與以 C 順序訪問數(shù)組轉(zhuǎn)置的 copy 方式做對(duì)比,如下實(shí)例:

import numpy as np 
a = np.arange(6).reshape(2,3)
for x in np.nditer(a.T):
    print (x, end=', ')
print ('\n')

for x in np.nditer(a.T.copy(order='C')):
    print (x, end=', ')
print ('\n')


0, 1, 2, 3, 4, 5, 

0, 3, 1, 4, 2, 5, 

[Finished in 0.1s]

從上述例子可以看出寡壮,a 和 a.T 的遍歷順序是一樣的贩疙,也就是他們?cè)趦?nèi)存中的存儲(chǔ)順序也是一樣的,但是 a.T.copy(order = 'C') 的遍歷結(jié)果是不同的况既,那是因?yàn)樗颓皟煞N的存儲(chǔ)方式是不一樣的这溅,默認(rèn)是按行訪問。

控制便來順序

  • for x in np.nditer(a, order="F"):Fortran order, 列優(yōu)先
  • for x in np.nditer(a.T, order='C'): C order , 行優(yōu)先
import numpy as np 
a = np.arange(0,60,5)
a = a.reshape(3,4)
print ('原數(shù)組:')
print (a)
print ('\n')
print ('轉(zhuǎn)置:')
b = a.T
print (b)
print ('\n')
print ('C排序:')
c = b.copy(order='C')
print (c)
for x in np.nditer(c):
    print (x, end=", ")
print ('\n')
print ('-----F-------')
c = b.copy(order='F')
print (c)
for x in np.nditer(c):
    print (x, end=', ')
原數(shù)組:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


轉(zhuǎn)置:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]


C排序:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]
0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55, 

-----F-------
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, [Finished in 0.1s]

b=a.T表示數(shù)組的轉(zhuǎn)置, 默認(rèn)情況下nditer是以行來讀取的, 當(dāng)然也可以直接以列來讀取, 使用nditer指定order以什么方式讀取如下:

import numpy as np 
a = np.arange(0,60,5)
a = a.reshape(3,4)
print (str('原').center(15,'*'))
print (a)
print ('\n')
print (str('C').center(15,'*'))
for x in np.nditer(a, order = 'C'):
    print (x, end = ', ')
print ('\n')
print ('F'.center(15, '*'))
for x in np.nditer(a, order = 'F'):
    print (x, end = ', ')
*******原*******
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


*******C*******
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 

*******F*******
0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55, [Finished in 0.1s]

修改數(shù)組中元素的值

nditer 對(duì)象有另一個(gè)可選參數(shù)op_flags 默認(rèn)情況下, nditer將視待迭代遍歷的數(shù)組為只讀對(duì)象(read-only), 為了在遍歷數(shù)組的同時(shí), 實(shí)現(xiàn)對(duì)數(shù)組元素值得修改, 必須指定read-write 或者 write-only 的模式.

import numpy
a = numpy.arange(0,60,5)
a = a.reshape(3,4)
print ('原始數(shù)組'.center(15,'*'))
print (a)
print ('\n')
for x in numpy.nditer(a, op_flags=['readwrite']):
    x[...]=2*x
print ('修改后'.center(15,'*'))
print (a)

******原始數(shù)組*****
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


******修改后******
[[  0  10  20  30]
 [ 40  50  60  70]
 [ 80  90 100 110]]
[Finished in 0.1s]

使用外部循環(huán):

nditer 類的構(gòu)造器擁有flags參數(shù), 他可以接受下列值:

參數(shù) 描述
c_index 可以跟蹤 C 順序的索引
f_index 可以跟蹤 Fortran 順序的索引
multi-index 每次迭代可以跟蹤一種索引類型
external_loop 給出的值是具有多個(gè)值的一維數(shù)組棒仍,而不是零維數(shù)組
import numpy
a = numpy.arange(0,60,5)
a = a.reshape(3,4)
print ('原始數(shù)組'.center(20,'*'))
print (a)
print ('\n')
print ('修改后的數(shù)組:'.center(20,'*'))
for x in numpy.nditer(a, flags = ['external_loop'], order = 'F'):
    print (x, end=", ")
********原始數(shù)組********
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


******修改后的數(shù)組:*******
[ 0 20 40], [ 5 25 45], [10 30 50], [15 35 55], [Finished in 0.1s]

廣播迭代

如果兩個(gè)數(shù)組是可廣播的, nditer組合對(duì)象能夠同時(shí)迭代他們, 假設(shè)數(shù)組a的維度為3x4, 數(shù)組b的維度為1x4 則使用以下迭代器(數(shù)組b被廣播到a的大小)

import numpy
a = numpy.arange(0,60,5)
a = a.reshape(3,4)
print ('第一個(gè)數(shù)組'.center(20, "*"))
print (a)
print ('\n')
print ('第二個(gè)數(shù)組'.center(20, "*"))
b = numpy.array([1,2,3,4],dtype = int)
print (b)
print ('\n')
print ('修改之后的數(shù)組'.center(20, "*"))
for x,y in numpy.nditer([a,b]):
    print ('%d:%d' % (x, y), end=', ')
    
    
*******第一個(gè)數(shù)組********
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


*******第二個(gè)數(shù)組********
[1 2 3 4]


******修改之后的數(shù)組*******
0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4, [Finished in 0.1s]

數(shù)組操作

處理數(shù)組大概分為以下幾類:

  • 修改數(shù)組形狀
  • 翻轉(zhuǎn)數(shù)組
  • 修改數(shù)組 維度
  • 連接數(shù)組
  • 分割數(shù)組
  • 數(shù)組元素的添加與刪除

修改數(shù)組形狀

函數(shù) 描述
reshape 不改變數(shù)據(jù)的條件下修改形狀
flat 數(shù)組元素迭代器
flatten 返回一份數(shù)組拷貝悲靴,對(duì)拷貝所做的修改不會(huì)影響原始數(shù)組
ravel 返回展開數(shù)組
numpy.reshape

numpy.reshape 函數(shù)可以在不改變數(shù)據(jù)的條件下修改形狀,格式如下: numpy.reshape(arr, newshape, order='C')

  • arr:要修改形狀的數(shù)組
  • newshape:整數(shù)或者整數(shù)數(shù)組莫其,新的形狀應(yīng)當(dāng)兼容原有形狀
  • order:'C' -- 按行癞尚,'F' -- 按列,'A' -- 原順序乱陡,'k' -- 元素在內(nèi)存中的出現(xiàn)順序浇揩。
import numpy as np
 
a = np.arange(8)
print ('原始數(shù)組:')
print (a)
print ('\n')
 
b = a.reshape(4,2)
print ('修改后的數(shù)組:')
print (b)

輸出結(jié)果如下:

原始數(shù)組:
[0 1 2 3 4 5 6 7]

修改后的數(shù)組:
[[0 1]
 [2 3]
 [4 5]
 [6 7]]
numpy.ndarray.flat

numpy.ndarray.flat 是一個(gè)數(shù)組元素迭代器, 實(shí)例:

import numpy
a = numpy.arange(9).reshape(3,3)
print ('原數(shù)組'.center(20,'*'))
for row in a:
    print (row)
# 對(duì)數(shù)組中每個(gè)元素都進(jìn)行處理, 可以使用flat屬性, 該屬性是一個(gè)數(shù)組元素迭代器.
print ('迭代后的數(shù)組'.center(20, '*'))
for element in a.flat:
    print (element)
    
    
********原數(shù)組*********
[0 1 2]
[3 4 5]
[6 7 8]
*******迭代后的數(shù)組*******
0
1
2
3
4
5
6
7
8
[Finished in 0.3s]
numpy.ndarray.flatten

numpy.ndarray.flatten 返回一份數(shù)組拷貝, 對(duì)拷貝所做的修改不會(huì)影響原始數(shù)組, 格式:

ndarray.flatten(order='C')

order'C'--按行, 'F'-- 按列, 'A' -- 按原順序, 'K' -- 元素在內(nèi)存中的出現(xiàn)順序.

import numpy
a = numpy.arange(8).reshape(2,4)
print('原'.center(20, '*'))
print (a)
print ('\n')
print ('展開數(shù)組:'.center(20, '*'))
print (a.flatten())
print ('\n')
print ('F順序展開的數(shù)組')
print (a.flatten(order='F'))

*********原**********
[[0 1 2 3]
 [4 5 6 7]]


*******展開數(shù)組:********
[0 1 2 3 4 5 6 7]


F順序展開的數(shù)組
[0 4 1 5 2 6 3 7]
[Finished in 0.1s]
numpy.ravel

numpy.ravel ()展平的數(shù)組元素, 順序通常是"C風(fēng)格", 返回?cái)?shù)組視圖(view, 有點(diǎn)類似C/C++引用reference的意味), 修改會(huì)影響原始數(shù)組,

numpy.ravel(a, order = 'C')

實(shí)例:

import numpy
a = numpy.arange(8).reshape(2,4)
print('原'.center(20, '*'))
print (a)
print ('\n')
print ('調(diào)用ravel函數(shù)之后'.center(20, '*'))
print (a.ravel())
print ('\n')
print ('F順序調(diào)用ravel函數(shù)的數(shù)組')
print (a.ravel(order = 'F'))
*********原**********
[[0 1 2 3]
 [4 5 6 7]]


****調(diào)用ravel函數(shù)之后*****
[0 1 2 3 4 5 6 7]


F順序調(diào)用ravel函數(shù)的數(shù)組
[0 4 1 5 2 6 3 7]
[Finished in 0.1s]

翻轉(zhuǎn)數(shù)組

函數(shù) 描述
transpose 對(duì)換數(shù)組的維度
ndarray.T self.transpose() 相同
rollaxis 向后滾動(dòng)指定的軸
swapaxes 對(duì)換數(shù)組的兩個(gè)軸

numpy.transpose

numpy.transpose 函數(shù)用于對(duì)換數(shù)組的維度

numpy.transpose(arr, axes)

arr要操作的數(shù)組

axes整數(shù)列表, 對(duì)應(yīng)維度, 通常所有維度都會(huì)對(duì)換

import numpy
a = numpy.arange(12).reshape(3,4)
print('原'.center(20, '*'))
print (a)
print ('\n')
print ('對(duì)換數(shù)組'.center(20, '*'))
print (numpy.transpose(a))
print ('\n')


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


********對(duì)換數(shù)組********
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]


[Finished in 0.2s]

numpy.ndarray.T 類似numpy.transpose:

import numpy
a = numpy.arange(12).reshape(3,4)
print('原'.center(20, '*'))
print (a)
print ('\n')
print ('轉(zhuǎn)置數(shù)組'.center(20, '*'))
print (a.T)
print ('\n')


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


********轉(zhuǎn)置數(shù)組********
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]


[Finished in 0.1s]
numpy.rollaxis

numpy.rollaxis函數(shù)向后滾動(dòng)特定的軸到一個(gè)特定位置, 格式如下:

numpy.rollaxis(arr, axis, start)

arr數(shù)組

axis 向后滾動(dòng)的軸, 其他軸的相對(duì)位置不會(huì)改變

start 默認(rèn)為0, 表示完整的滾動(dòng), 回滾到特定的位置

import numpy
a = numpy.arange(8).reshape(2,2,2)
print('原'.center(20, '*'))
print (a)
print ('\n')
# 將軸2滾動(dòng)到軸0(寬度到深度)

print ('調(diào)用rollaxis函數(shù)'.center(20, '*'))
print (numpy.rollaxis(a,2))
# 將軸0 滾動(dòng)到軸1位置, (寬度到高度)
print ('\n')
print ('調(diào)用rollaxis函數(shù)')
print (numpy.rollaxis(a,2,1))


*********原**********
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]


****調(diào)用rollaxis函數(shù)****
[[[0 2]
  [4 6]]

 [[1 3]
  [5 7]]]


調(diào)用rollaxis函數(shù)
[[[0 2]
  [1 3]]

 [[4 6]
  [5 7]]]
[Finished in 0.1s]
numpy.swapaxes

numpy.swapaxes 函數(shù)用于交換數(shù)組的兩個(gè)軸, 格式如下:

numpy.swapaxes(arr, sxis1, axis2)

arr 數(shù)組

axis1 對(duì)應(yīng)第一個(gè)軸的整數(shù)

axis2 對(duì)應(yīng)第二個(gè)軸的整數(shù)

import numpy
a = numpy.arange(8).reshape(2,2,2)
print('原'.center(20, '*'))
print (a)
print ('\n')
# 現(xiàn)在交換軸0(深度方向)到軸2(寬度方向)

print ('調(diào)用swapaxes函數(shù)后的數(shù)組'.center(20, '*'))
print (numpy.swapaxes(a, 2, 0))

*********原**********
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]


**調(diào)用swapaxes函數(shù)后的數(shù)組**
[[[0 4]
  [2 6]]

 [[1 5]
  [3 7]]]
[Finished in 0.1s]

修改數(shù)組維度

維度 描述
broadcast 產(chǎn)生模仿廣播的對(duì)象
broadcast_to 將數(shù)組廣播到新形狀
expand_dims 擴(kuò)展數(shù)組的形狀
squeeze 從數(shù)組的形狀中刪除一維條目
numpy.broadcast

numpy.broadcast 用于模仿廣播的對(duì)象, 它返回一個(gè)對(duì)象, 該對(duì)象封裝了將一個(gè)數(shù)組廣播到另一個(gè)數(shù)組的結(jié)果, 該函數(shù)使用兩個(gè)數(shù)組作為輸入?yún)?shù), 如下實(shí)例:

import numpy as np
 
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6])  
 
# 對(duì) y 廣播 x
b = np.broadcast(x,y)  
# 它擁有 iterator 屬性,基于自身組件的迭代器元組
print (b)
print ('對(duì) y 廣播 x:')
r,c = b.iters
 
# Python3.x 為 next(context) 蛋褥,Python2.x 為 context.next()
print (next(r), next(c))
print (next(r), next(c))
print ('\n')
# shape 屬性返回廣播對(duì)象的形狀
 
print ('廣播對(duì)象的形狀:')
print (b.shape)
print ('\n')
# 手動(dòng)使用 broadcast 將 x 與 y 相加
b = np.broadcast(x,y)
c = np.empty(b.shape)
 
print ('手動(dòng)使用 broadcast 將 x 與 y 相加:')
print (c.shape)
print ('\n')
c.flat = [u + v for (u,v) in b]
 
print ('調(diào)用 flat 函數(shù):')
print (c)
print ('\n')
# 獲得了和 NumPy 內(nèi)建的廣播支持相同的結(jié)果
 
print ('x 與 y 的和:')
print (x + y)

<numpy.broadcast object at 0x55c6b266fdb0>
對(duì) y 廣播 x:
1 4
1 5


廣播對(duì)象的形狀:
(3, 3)


手動(dòng)使用 broadcast 將 x 與 y 相加:
(3, 3)


調(diào)用 flat 函數(shù):
[[ 5.  6.  7.]
 [ 6.  7.  8.]
 [ 7.  8.  9.]]


x 與 y 的和:
[[5 6 7]
 [6 7 8]
 [7 8 9]]
[Finished in 0.1s]
numpy.broadcast_to

numpy.broadcast_to 函數(shù)將數(shù)組廣播到新形狀, 他在原始數(shù)組上返回只讀視圖, 它通常不連續(xù), 如果新形狀不符合numpy的廣播規(guī)則, 該函數(shù)可能會(huì)拋出ValueError

numpy.broadcast_to(array, shape, subok)
import numpy

a = numpy.arange(4).reshape(1,4)
print ('原數(shù)組:')
print (a)
print ('\n')

print ('調(diào)用broadcast_to函數(shù)之后')
print (numpy.broadcast_to(a,(2,4)))

原數(shù)組:
[[0 1 2 3]]


調(diào)用broadcast_to函數(shù)之后
[[0 1 2 3]
 [0 1 2 3]]
[Finished in 0.1s]
numpy.expand_dims

numpy.expand_dims 函數(shù)通過指定位置插入新的軸來擴(kuò)展數(shù)組形狀, 函數(shù)格式:

numpy.expand_dims(arr, axis)

arr 輸入的數(shù)組

axis 新軸插入的位置, 0 表示行, 1 表示列

import numpy 

x = numpy.array(([1,2],[3,4]))
print ('數(shù)組x')
print (x)
print ('\n')
y = numpy.expand_dims(x, axis = 0)
print ('數(shù)組y')
print (y)
print ('\n')
print ('數(shù)組x和y的形狀')
print (x.shape, y.shape)
print ('\n')
# 在軸1 位置插入軸
y = numpy.expand_dims(x, axis = 1)
print ('在位置1 插入軸之后的數(shù)組')
print (y)
print ('\n')
print ('x.ndim y.ndim')
print (x.ndim, y.ndim)
print ('\n')
print ('x.shape, y.shape')
print (x.shape, y.shape)

數(shù)組x
[[1 2]
 [3 4]]


數(shù)組y
[[[1 2]
  [3 4]]]


數(shù)組x和y的形狀
(2, 2) (1, 2, 2)


在位置1 插入軸之后的數(shù)組
[[[1 2]]

 [[3 4]]]


x.ndim y.ndim
2 3


x.shape, y.shape
(2, 2) (2, 1, 2)
[Finished in 0.1s]
numpy.squeeze

numpy.squeeze 從給定數(shù)組的形狀中刪除一維的條目,

numpy.squeeze(arr, axis)

arr輸入數(shù)組

axis 整數(shù)或整數(shù)元組, 用于選擇形狀中的一維條目的子集

import numpy

x = numpy.arange(9).reshape(1,3,3)
print ('數(shù)組x')
print (x)
print ('\n')
y = numpy.squeeze(x)
print ('數(shù)組y')
print (y)
print ('\n')
print ('x.shape, y.shape')
print (x.shape, y.shape)


數(shù)組x
[[[0 1 2]
  [3 4 5]
  [6 7 8]]]


數(shù)組y
[[0 1 2]
 [3 4 5]
 [6 7 8]]


x.shape, y.shape
(1, 3, 3) (3, 3)
[Finished in 0.1s]

連接數(shù)組

函數(shù) 描述
concatenate 連接沿現(xiàn)有軸的數(shù)組序列
stack 沿著新的軸加入一系列數(shù)組临燃。
hstack 水平堆疊序列中的數(shù)組(列方向)
vstack 豎直堆疊序列中的數(shù)組(行方向)
concatenate

用于沿著指定軸連接相同形狀的兩個(gè)或多個(gè)數(shù)組

numpy.concatenate((a1,a2, ...),axis)

a1,a2,a3,... 相同類型的數(shù)組

axis 沿著它連接數(shù)組的軸, 默認(rèn)為0

import numpy

a = numpy.array([[1,2],[3,4]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
b = numpy.array([[5,6],[7,8]])
print ('第二個(gè)數(shù)組')
print (b)
print ('\n')
# 兩個(gè)數(shù)組的維度相同

print ('沿軸0連接兩個(gè)數(shù)組:')
print (numpy.concatenate((a,b)))
print ('\n')
print ('沿著軸1連接兩個(gè)數(shù)組')
print (numpy.concatenate((a,b),axis = 1))
第一個(gè)數(shù)組
[[1 2]
 [3 4]]


第二個(gè)數(shù)組
[[5 6]
 [7 8]]


沿軸0連接兩個(gè)數(shù)組:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]


沿著軸1連接兩個(gè)數(shù)組
[[1 2 5 6]
 [3 4 7 8]]
[Finished in 0.1s]
numpy.stack

用于沿新軸連接數(shù)組序列

numpy.stack(arrays, axis)

arrays相同形狀的數(shù)組序列

axis 返回?cái)?shù)組中的軸, 輸入數(shù)組沿著它來堆疊

import numpy

a = numpy.array([[1,2],[3,4]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
b = numpy.array([[5,6],[7,8]])
print ('第二個(gè)數(shù)組')
print (b)
print ('\n')

print ('沿著0堆疊兩個(gè)數(shù)組')
print (numpy.stack((a,b),0))
print ('\n')
print ('沿著列堆疊兩個(gè)數(shù)組')
print (numpy.stack((a,b),1))


第一個(gè)數(shù)組
[[1 2]
 [3 4]]


第二個(gè)數(shù)組
[[5 6]
 [7 8]]


沿著0堆疊兩個(gè)數(shù)組
[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]


沿著列堆疊兩個(gè)數(shù)組
[[[1 2]
  [5 6]]

 [[3 4]
  [7 8]]]
[Finished in 0.1s]
numpy.hstack

是numpy.stack的變體睛驳, 通過水平堆疊來生成數(shù)組

import numpy

a = numpy.array([[1,2],[3,4]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
b = numpy.array([[5,6],[7,8]])
print ('第二個(gè)數(shù)組')
print (b)
print ('\n')

print ('水平堆疊')
c = numpy.hstack((a,b))
print (c)


第一個(gè)數(shù)組
[[1 2]
 [3 4]]


第二個(gè)數(shù)組
[[5 6]
 [7 8]]


水平堆疊
[[1 2 5 6]
 [3 4 7 8]]
[Finished in 0.1s]
numpy.vstack

通過垂直堆疊來生成數(shù)組

import numpy

a = numpy.array([[1,2],[3,4]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
b = numpy.array([[5,6],[7,8]])
print ('第二個(gè)數(shù)組')
print (b)
print ('\n')

print ('垂直堆疊')
print (numpy.vstack((a,b)))



第一個(gè)數(shù)組
[[1 2]
 [3 4]]


第二個(gè)數(shù)組
[[5 6]
 [7 8]]


垂直堆疊
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
[Finished in 0.1s]

分割數(shù)組

函數(shù) 數(shù)組及操作
split 將一個(gè)數(shù)組分割為多個(gè)子數(shù)組
hsplit 將一個(gè)數(shù)組水平分割為多個(gè)子數(shù)組(按列)
vsplit 將一個(gè)數(shù)組垂直分割為多個(gè)子數(shù)組(按行)
numpy.split

沿特定的軸將數(shù)組分割為子數(shù)組

numpy.split(ary, indices_or_sections, axis)

ary 被分割的數(shù)組

indices_or_se_ctinos 如果是一個(gè)整數(shù)就用該數(shù)平均切分烙心,如果是一個(gè)數(shù)組,為沿軸切分的位置(左開右閉)

沿哪個(gè)維度切割 0乏沸,1

import numpy

a = numpy.arange(9)
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')

print ('將數(shù)組分為三個(gè)大小相等的子數(shù)組')
b = numpy.split(a, 3)
print (b)
print ('\n')
print ('將數(shù)組在一維數(shù)組中表明的位置分割')
b = numpy.split(a,[4,7])
print (b)


第一個(gè)數(shù)組
[0 1 2 3 4 5 6 7 8]


將數(shù)組分為三個(gè)大小相等的子數(shù)組
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]


將數(shù)組在一維數(shù)組中表明的位置分割
[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
[Finished in 0.1s]
numpy.hsplit

用于水平分割數(shù)組淫茵, 通過指定要返回的相同形狀的數(shù)組數(shù)量來拆分原數(shù)組

import numpy
harr = numpy.floor(10 * numpy.random.random((2,6)))
print ('原數(shù)組')
print (harr)

print ('拆分后')
print (numpy.hsplit(harr,3))


原數(shù)組
[[ 6.  3.  8.  0.  4.  8.]
 [ 6.  6.  7.  0.  3.  1.]]
拆分后
[array([[ 6.,  3.],
       [ 6.,  6.]]), array([[ 8.,  0.],
       [ 7.,  0.]]), array([[ 4.,  8.],
       [ 3.,  1.]])]
[Finished in 0.3s]
numpy.vsplit

沿垂直軸分割, 分割方式和hsplit相同

import numpy
a = numpy.arange(16).reshape(4,4)
print ('第一個(gè)數(shù)組:')
print (a)
print ('\n')

print ('豎直分割')
b = numpy.vsplit(a,2)
print (b)

第一個(gè)數(shù)組:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]


豎直分割
[array([[0, 1, 2, 3],
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])]
[Finished in 0.1s]

數(shù)組元素的添加與刪除

函數(shù) 元素及描述
resize 返回指定形狀的新數(shù)組
append 將值添加到數(shù)組末尾
insert 沿指定軸將值插入到指定下標(biāo)之前
delete 刪掉某個(gè)軸的子數(shù)組,并返回刪除后的新數(shù)組
unique 查找數(shù)組內(nèi)的唯一元素
numpy.resize

返回指定大小的新數(shù)組, 如果新數(shù)組大小大于原始大小, 則包含原數(shù)組中的元素副本

numpy.resize(arr, shape)

arr 要修改大小的數(shù)組

shape 返回?cái)?shù)組的新形狀

import numpy

a = numpy.array([[1,2,3],[4,5,6]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')

print ('第一個(gè)數(shù)組形狀')
print (a.shape)
print ('\n')
b = numpy.resize(a,(3,2))
print ('第二個(gè)數(shù)組')
print (b)
print ('第二個(gè)數(shù)組形狀')
print (b.shape)
print ('\n')
# 注意a的第一行b中重復(fù)出現(xiàn), 因?yàn)槌叽缱兇罅?print ('修改后的第二個(gè)數(shù)組大小')
print (numpy.resize(a,(3,3)))

第一個(gè)數(shù)組
[[1 2 3]
 [4 5 6]]


第一個(gè)數(shù)組形狀
(2, 3)


第二個(gè)數(shù)組
[[1 2]
 [3 4]
 [5 6]]
第二個(gè)數(shù)組形狀
(3, 2)


修改后的第二個(gè)數(shù)組大小
[[1 2 3]
 [4 5 6]
 [1 2 3]]
[Finished in 0.1s]
numpy.append

函數(shù)在數(shù)組末尾添加值, 追加操作會(huì)分配整個(gè)數(shù)組, 并把原來的數(shù)組復(fù)制到新數(shù)組里, 此外, 輸入數(shù)組的維度必須匹配否則將生成ValueError

append函數(shù)返回的始終是一個(gè)一維數(shù)組

numpy.append(arr, values, axis=None)
  • arr:輸入數(shù)組
  • values:要向arr添加的值蹬跃,需要和arr形狀相同(除了要添加的軸)
  • axis:默認(rèn)為 None匙瘪。當(dāng)axis無定義時(shí),是橫向加成蝶缀,返回總是為一維數(shù)組丹喻!當(dāng)axis有定義的時(shí)候,分別為0和1的時(shí)候翁都。當(dāng)axis有定義的時(shí)候碍论,分別為0和1的時(shí)候(列數(shù)要相同)。當(dāng)axis為1時(shí)柄慰,數(shù)組是加在右邊(行數(shù)要相同)鳍悠。
import numpy as np

a = np.array([[1,2,3],[4,5,6]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
print ('向數(shù)組添加元素')
print (np.append(a, [7,8,9]))
print ('\n')
print ('沿軸0添加元素')
print (np.append(a, [[7,8,9]], axis = 0))
print ('\n')
print ('沿軸1添加元素')
print (np.append(a, [[5,5,5],[7,8,9]], axis = 1))


第一個(gè)數(shù)組
[[1 2 3]
 [4 5 6]]


向數(shù)組添加元素
[1 2 3 4 5 6 7 8 9]


沿軸0添加元素
[[1 2 3]
 [4 5 6]
 [7 8 9]]


沿軸1添加元素
[[1 2 3 5 5 5]
 [4 5 6 7 8 9]]
[Finished in 0.1s]
numpy.insert

在給定索引之前, 沿給定軸在輸入數(shù)組中插入值, 如果值的類型轉(zhuǎn)換為要插入, 則它與輸入數(shù)組不同, 插入沒有原地的, 函數(shù)會(huì)返回一個(gè)新數(shù)組, 此外未提供軸, 則輸入數(shù)組被展開.

numpy.insert(arr, obj, values, axis)

arr 輸入數(shù)組

obj在其 之前插入值的索引

values要插入的值

axis 沿著它插入的軸, 如果未提供, 則輸入數(shù)組會(huì)被展開

import numpy as np

a = np.array([[1,2], [3,4], [5,6]])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')

print ('未傳遞axis參數(shù), 在插入之前輸入數(shù)組會(huì)被展開')
print (np.insert(a,3,[11,22]))
print ('\n')
print ('傳遞axis參數(shù), 會(huì)廣播值數(shù)組來配輸入數(shù)組')
print ('沿軸0廣播')
print (np.insert(a, 1, [11], axis = 0))
print ('\n')
print ('沿軸1廣播')
print (np.insert(a,1,11,axis = 1))


第一個(gè)數(shù)組
[[1 2]
 [3 4]
 [5 6]]


未傳遞axis參數(shù), 在插入之前輸入數(shù)組會(huì)被展開
[ 1  2  3 11 22  4  5  6]


傳遞axis參數(shù), 會(huì)廣播值數(shù)組來配輸入數(shù)組
沿軸0廣播
[[ 1  2]
 [11 11]
 [ 3  4]
 [ 5  6]]


沿軸1廣播
[[ 1 11  2]
 [ 3 11  4]
 [ 5 11  6]]

numpy.delete

返回從輸入數(shù)組中刪除指定子數(shù)組的新數(shù)組, 與insert函數(shù)一樣, 如果未提供軸參數(shù), 輸入數(shù)組將展開

numpy.delete(arr, obj, axis)

arr 輸入數(shù)組

obj 可以被切片, 整數(shù)或者整數(shù)數(shù)組, 表明要從輸入數(shù)組刪除的子數(shù)組

axis 沿著它刪除給定子數(shù)組的軸, 如果未提供, 則輸入數(shù)組會(huì)被展開

import numpy as np

a = np.arange(12).reshape(3,4)
print (a)
print ('\n')
print ('未傳遞axis參數(shù), 在插入之前輸入數(shù)組會(huì)被展開')
print (np.delete(a,5))
print ('刪除第二列')
print (np.delete(a,1,axis = 1))
print ('\n')
print ('包含從數(shù)組中刪除的替代值的切片')
a = np.array([1,2,3,4,5,6,7,8,9,10])
print (np.delete(a, np.s_[::2]))


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


未傳遞axis參數(shù), 在插入之前輸入數(shù)組會(huì)被展開
[ 0  1  2  3  4  6  7  8  9 10 11]
刪除第二列
[[ 0  2  3]
 [ 4  6  7]
 [ 8 10 11]]


包含從數(shù)組中刪除的替代值的切片
[ 2  4  6  8 10]

numpy.unique

用于去除數(shù)組中的重復(fù)元素

numpy.unique(arr, return_index, return_inverse, return_counts)

arr 輸入數(shù)組, 如果不是一維數(shù)組則會(huì)展開

return_index 如果為true, 返回新列表元素在舊列表中的位置(下表), 并以列表形式存儲(chǔ)

return_inverse如果為true, 返回舊列表元素在新列表中的位置(下標(biāo)), 并以列表形式存儲(chǔ)

return_counts如果為true, 返回去重?cái)?shù)組中的元素在原數(shù)組中出現(xiàn)次數(shù)

import numpy as np

a = np.array([5,2,6,2,7,5,6,8,2,9])
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')

print ('第一個(gè)數(shù)組的去重值')
u = np.unique(a)
print (u)
print ('\n')

print ('去重?cái)?shù)組的索引數(shù)組')
u, indices = np.unique(a, return_index = True)
print (indices)
print ('\n')

print ('我們可以看到每個(gè)和原數(shù)組下表對(duì)應(yīng)的數(shù)值')
print (a)
print ('\n')
print ('去重?cái)?shù)組的下標(biāo)')
u, indices = np.unique(a, return_inverse = True)
print (u)
print ('\n')
print ('下標(biāo)為')
print (indices)
print ('\n')
print ('使用下標(biāo)重構(gòu)原數(shù)組')
print (u[indices])
print ('\n')
print ('返回去重元素的重復(fù)數(shù)量')
u, indices = np.unique(a, return_counts = True)
print (u)
print (indices)


第一個(gè)數(shù)組
[5 2 6 2 7 5 6 8 2 9]


第一個(gè)數(shù)組的去重值
[2 5 6 7 8 9]


去重?cái)?shù)組的索引數(shù)組
[1 0 2 4 7 9]


我們可以看到每個(gè)和原數(shù)組下表對(duì)應(yīng)的數(shù)值
[5 2 6 2 7 5 6 8 2 9]


去重?cái)?shù)組的下標(biāo)
[2 5 6 7 8 9]


下標(biāo)為
[1 0 2 0 3 1 2 4 0 5]


使用下標(biāo)重構(gòu)原數(shù)組
[5 2 6 2 7 5 6 8 2 9]


返回去重元素的重復(fù)數(shù)量
[2 5 6 7 8 9]
[3 2 2 1 1 1]

numpy 位運(yùn)算

NumPy "bitwise_" 開頭的函數(shù)是位運(yùn)算函數(shù)税娜。

NumPy 位運(yùn)算包括以下幾個(gè)函數(shù):

函數(shù) 描述
bitwise_and 對(duì)數(shù)組元素執(zhí)行位與操作
bitwise_or 對(duì)數(shù)組元素執(zhí)行位或操作
invert 按位取反
left_shift 向左移動(dòng)二進(jìn)制表示的位
right_shift 向右移動(dòng)二進(jìn)制表示的位

注:也可以使用 "&"、 "~"藏研、 "|" 和 "^" 等操作符進(jìn)行計(jì)算敬矩。

import numpy as np

print ('13和17二進(jìn)制形式')
a,b = 13, 17
print (bin(a), bin(b))
print ('\n')
print ('13和17的位與')
print (np.bitwise_and(13,17))


13和17二進(jìn)制形式
0b1101 0b10001


13和17的位與
1

以上實(shí)例可以用下表來說明:

1 1 0 1
AND
1 0 0 0 1
運(yùn)算結(jié)果 0 0 0 0 1

位與操作運(yùn)算規(guī)律如下:

A B AND
1 1 1
1 0 0
0 1 0
0 0 0

bitwise_or

對(duì)數(shù)組中整數(shù)的二進(jìn)制形式執(zhí)行位或運(yùn)算

import numpy as np

a, b = 13, 17
print ('13和17的二進(jìn)制形式')
print (bin(a), bin(b))

print ('13和17的位或')
print (np.bitwise_or(13,17))


13和17的二進(jìn)制形式
0b1101 0b10001
13和17的位或
29

以上實(shí)例可以用下表來說明:

1 1 0 1
OR
1 0 0 0 1
運(yùn)算結(jié)果 1 1 1 0 1

位或操作運(yùn)算規(guī)律如下:

A B OR
1 1 1
1 0 1
0 1 1
0 0 0

invert

函數(shù)對(duì)數(shù)組中整數(shù)進(jìn)行取反運(yùn)算, 0變?yōu)?, 1變?yōu)?

對(duì)于有符號(hào)的整數(shù), 取該二進(jìn)制的補(bǔ)碼然后+1 二進(jìn)制數(shù), 最高位為0表示整數(shù), 最高位為1 表示負(fù)數(shù)

看看 ~1 的計(jì)算步驟:

  • 1(這里叫:原碼)轉(zhuǎn)二進(jìn)制 = 00000001

  • 按位取反 = 11111110

  • 發(fā)現(xiàn)符號(hào)位(即最高位)為1(表示負(fù)數(shù)),將除符號(hào)位之外的其他數(shù)字取反 = 10000001

  • 末位加1取其補(bǔ)碼 = 10000010

  • 轉(zhuǎn)換回十進(jìn)制 = -2

  • 表達(dá)式 二進(jìn)制值(2 的補(bǔ)數(shù)) 十進(jìn)制值
    5 00000000 00000000 00000000 0000010 5
    ~5 11111111 11111111 11111111 11111010 -6
import numpy as np

print ('13的位反轉(zhuǎn),其中ndarra的dtype是uint8')
print (np.invert(np.array([13], dtype = np.uint8)))
print ('\n')
# 比較13和242的二進(jìn)制數(shù)表示, 我們發(fā)現(xiàn)了位的反轉(zhuǎn)
print ('13的二進(jìn)制表示:')
print (np.binary_repr(13, width = 8))
print ('\n')
print ('242的二進(jìn)制表示')
print (np.binary_repr(242, width = 8))


13的位反轉(zhuǎn),其中ndarra的dtype是uint8
[242]


13的二進(jìn)制表示:
00001101


242的二進(jìn)制表示
11110010

left_shift

將數(shù)組元素的二進(jìn)制形式向左移動(dòng)到指定位置, 右側(cè)附加相等數(shù)量的0

import numpy as np

print ('將10向左移動(dòng)兩位')
print (np.left_shift(10,2))
print ('\n')

print ('10的二進(jìn)制表示')
print (np.binary_repr(10, width = 8))
print ('40的二進(jìn)制表示')
print (np.binary_repr(40, width = 8))
# '00001010'中的兩位移動(dòng)到左邊, 并在右邊添加了兩個(gè)0



將10向左移動(dòng)兩位
40


10的二進(jìn)制表示
00001010
40的二進(jìn)制表示
00101000

right_shift

函數(shù)將數(shù)組元素的二進(jìn)制形式向右移動(dòng)到指定的位置, 左側(cè)附加相等數(shù)量的0

import numpy as np

print ('將40右移兩位')
print (np.right_shift(40,2))
print ('\n')


print ('40的二進(jìn)制表示')
print (np.binary_repr(40, width = 8))
print ('\n')

print ('10的二進(jìn)制表示')
print (np.binary_repr(10, width = 8))
# '00001010'中的兩位移動(dòng)到了右邊,  并在左邊添加了兩個(gè)0


將40右移兩位
10


40的二進(jìn)制表示
00101000


10的二進(jìn)制表示
00001010

numpy字符串函數(shù)

以下函數(shù)用于對(duì) dtype 為 numpy.string_ 或 numpy.unicode_ 的數(shù)組執(zhí)行向量化字符串操作蠢挡。 它們基于 Python 內(nèi)置庫中的標(biāo)準(zhǔn)字符串函數(shù)弧岳。

這些函數(shù)在字符數(shù)組類(numpy.char)中定義。

函數(shù) 描述
add() 對(duì)兩個(gè)數(shù)組的逐個(gè)字符串元素進(jìn)行連接
multiply() 返回按元素多重連接后的字符串
center() 居中字符串
capitalize() 將字符串第一個(gè)字母轉(zhuǎn)換為大寫
title() 將字符串的每個(gè)單詞的第一個(gè)字母轉(zhuǎn)換為大寫
lower() 數(shù)組元素轉(zhuǎn)換為小寫
upper() 數(shù)組元素轉(zhuǎn)換為大寫
split() 指定分隔符對(duì)字符串進(jìn)行分割业踏,并返回?cái)?shù)組列表
splitlines() 返回元素中的行列表缩筛,以換行符分割
strip() 移除元素開頭或者結(jié)尾處的特定字符
join() 通過指定分隔符來連接數(shù)組中的元素
replace() 使用新字符串替換字符串中的所有子字符串
decode() 數(shù)組元素依次調(diào)用str.decode
encode() 數(shù)組元素依次調(diào)用str.encode

numpy.char.add()

依次對(duì)兩個(gè)數(shù)組的元素進(jìn)行字符串連接

import numpy as np

print ('連接兩個(gè)字符串')
print (np.char.add(['hello'],['word']))
print ('連接示列')
print (np.char.add(['hello', 'hi'],['word','world']))

連接兩個(gè)字符串
['helloword']
連接示列
['helloword' 'hiworld']

numpy.char.multiply()

執(zhí)行多重連接

import numpy as np

print (np.char.multiply('python', 5))

pythonpythonpythonpythonpython

numpy.char.center()

函數(shù)用于將字符串居中, 并使用指定字符在左側(cè)和右側(cè)進(jìn)行填充

np.char.center(str, width, fillchar)
str: 字符串, width:長(zhǎng)度, fillchar: 填充字符
import numpy as np

print (np.char.center('python', 20, fillchar = '*'))


*******python*******

numpy.char.capitalize()

將字符串的第一個(gè)字母裝換為大寫

>>> import numpy as np
>>> print (np.char.capitalize('python')
... )
Python

numpy.char.title()

字符串的每個(gè)單詞的第一個(gè)字母轉(zhuǎn)換為大寫

>>> import numpy as np
>>> print (np.char.title('i love python'))
I Love Python

numpy.char.lower()

對(duì)數(shù)組的每個(gè)元素轉(zhuǎn)換為小寫, 對(duì)每個(gè)元素調(diào)用str.lower

>>> print (np.char.lower(['HELLO','PYTHON'])) # 操作數(shù)組
['hello' 'python']
>>> print (np.char.lower('PYTHON')) # 操作字符串
python

numpy.char.upper()

將數(shù)組每個(gè)元素轉(zhuǎn)換成大寫, 同char.lower()

numpy.char.split()

通過指定分隔符對(duì)字符串進(jìn)行分割,并返回?cái)?shù)組堡称。默認(rèn)情況下瞎抛,分隔符為空格。

>>> print (np.char.split('i love python')) # 默認(rèn)分割符為空格
['i', 'love', 'python']
>>> print (np.char.split('pigdaqiang.top', sep = '.')) # 指定分隔符為 .
['pigdaqiang', 'top']

numpy.char.splitlines()

以換行符作為分隔符, 并返回?cái)?shù)組

>>> print (np.char.splitlines('i\r\nlove python'))
['i', 'love python']
>>> print (np.char.splitlines('i\rlove python'))
['i', 'love python']

注意區(qū)別linux下和win下?lián)Q行符的區(qū)別 \r \n \r\n

numpy.char.strip()

用于移除開頭或結(jié)尾處的特定字符

>>> print (np.char.strip('hhello', 'h')) # 移除字符串頭尾的h字符
ello
>>> 
>>> print (np.char.strip(['hello','hi','high'],'h')) # 移除數(shù)組元素頭尾的a字符
['ello' 'i' 'ig']
>>> 

numpy.char.join()

通過指定分割符來連接數(shù)組中的元素或字符串

>>> print (np.char.join(':','hello'))
h:e:l:l:o
>>> print (np.char.join([':','*'],['hello','python']))
['h:e:l:l:o' 'p*y*t*h*o*n']
>>> 

numpy.char.replace()

使用新字符串代替字符串中的所有子字符串

>>> print (np.char.replace('i love python',' ','*'))
i*love*python
>>> 

numpy.char.encode()

函數(shù)對(duì)數(shù)組中的每個(gè)元素調(diào)用str.encode函數(shù), 默認(rèn)編碼是utf-8, 可以使用標(biāo)準(zhǔn)python庫中的編解碼器

>>> print (np.char.encode('hello','cp500'))
b'\x88\x85\x93\x93\x96'
>>> 

numpy.char.decode()

函數(shù)對(duì)編碼的元素進(jìn)行str.encode()解碼

>>> a = np.char.encode('hello', 'cp500')
>>> print (a, np.char.decode(a, 'cp500'))
b'\x88\x85\x93\x93\x96' hello
>>> 

numpy數(shù)學(xué)函數(shù)

NumPy 包含大量的各種數(shù)學(xué)運(yùn)算的函數(shù)却紧,包括三角函數(shù)桐臊,算術(shù)運(yùn)算的函數(shù),復(fù)數(shù)處理函數(shù)等晓殊。

三角函數(shù)

NumPy 提供了標(biāo)準(zhǔn)的三角函數(shù):sin()断凶、cos()、tan()巫俺。

import numpy as np

a = np.array([0,20,45,60,90])
print ('不同角度的正弦值')
# 通過乘pi/180轉(zhuǎn)化為弧度
print (np.sin(a*np.pi/180))
print ('\n')
print ('數(shù)組中角度的余玄值')
print (np.cos(a*np.pi/180))
print ('\n')
print ('數(shù)組中角度的正切值')
print (np.tan(a*np.pi/180))


不同角度的正弦值
[ 0.          0.34202014  0.70710678  0.8660254   1.        ]


數(shù)組中角度的余玄值
[  1.00000000e+00   9.39692621e-01   7.07106781e-01   5.00000000e-01
   6.12323400e-17]


數(shù)組中角度的正切值
[  0.00000000e+00   3.63970234e-01   1.00000000e+00   1.73205081e+00
   1.63312394e+16]

arcsin认烁,arccos,和 arctan 函數(shù)返回給定角度的 sin介汹,cos 和 tan 的反三角函數(shù)却嗡。

這些函數(shù)的結(jié)果可以通過 numpy.degrees() 函數(shù)將弧度轉(zhuǎn)換為角度。

import numpy as np
 
a = np.array([0,30,45,60,90])  
print ('含有正弦值的數(shù)組:')
sin = np.sin(a*np.pi/180)  
print (sin)
print ('\n')
print ('計(jì)算角度的反正弦嘹承,返回值以弧度為單位:')
inv = np.arcsin(sin)  
print (inv)
print ('\n')
print ('通過轉(zhuǎn)化為角度制來檢查結(jié)果:')
print (np.degrees(inv))
print ('\n')
print ('arccos 和 arctan 函數(shù)行為類似:')
cos = np.cos(a*np.pi/180)  
print (cos)
print ('\n')
print ('反余弦:')
inv = np.arccos(cos)  
print (inv)
print ('\n')
print ('角度制單位:')
print (np.degrees(inv))
print ('\n')
print ('tan 函數(shù):')
tan = np.tan(a*np.pi/180)  
print (tan)
print ('\n')
print ('反正切:')
inv = np.arctan(tan)  
print (inv)
print ('\n')
print ('角度制單位:')
print (np.degrees(inv))


含有正弦值的數(shù)組:
[0.         0.5        0.70710678 0.8660254  1.        ]


計(jì)算角度的反正弦窗价,返回值以弧度為單位:
[0.         0.52359878 0.78539816 1.04719755 1.57079633]


通過轉(zhuǎn)化為角度制來檢查結(jié)果:
[ 0. 30. 45. 60. 90.]


arccos 和 arctan 函數(shù)行為類似:
[1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01
 6.12323400e-17]


反余弦:
[0.         0.52359878 0.78539816 1.04719755 1.57079633]


角度制單位:
[ 0. 30. 45. 60. 90.]


tan 函數(shù):
[0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+00
 1.63312394e+16]


反正切:
[0.         0.52359878 0.78539816 1.04719755 1.57079633]


角度制單位:
[ 0. 30. 45. 60. 90.]

舍入函數(shù)

函數(shù)返回指定數(shù)字的四舍五入值

numpy.around(a, decimals)

a 數(shù)組

decimals 舍入的小數(shù)位數(shù), 默認(rèn)值為0, 如果為負(fù)數(shù), 整數(shù)將四舍五入到小數(shù)點(diǎn)的左側(cè)

import numpy as np

a = np.array([1.0, 5.55, 123, 0.567, 25.532])
print ('原數(shù)組')
print (a)
print ('\n')
print ('舍入后')
print (np.around(a))
print (np.around(a, decimals = 1))
print (np.around(a, decimals = -1))


原數(shù)組
[   1.       5.55   123.       0.567   25.532]


舍入后
[   1.    6.  123.    1.   26.]
[   1.     5.6  123.     0.6   25.5]
[   0.   10.  120.    0.   30.]

numpy.floor()

返回小于或者等于指定表達(dá)式的最大整數(shù), 向下取整

import numpy as np

a = np.array([-1.7, 1.5, -0.2, 0.6, 10])
print ('提供的數(shù)組')
print (a)
print ('\n')
print ('修改后的數(shù)組')
print (np.floor(a))


提供的數(shù)組
[ -1.7   1.5  -0.2   0.6  10. ]


修改后的數(shù)組
[ -2.   1.  -1.   0.  10.]

numpy.ceil()

返回大于或者等于指定表達(dá)式的最小整數(shù), 即向上取整. 用法同floor

numpy算術(shù)函數(shù)

算術(shù)函數(shù)包含簡(jiǎn)單的加減乘除:add(), substract(), multiply(), divide()

數(shù)組必須具有相同形狀或符合數(shù)組廣播 規(guī)則

import numpy as np

a = np.arange(9, dtype = np.float_).reshape(3,3)
print ('第一個(gè)數(shù)組')
print (a)
print ('\n')
print ('第二個(gè)數(shù)組')
b = np.array([10,10,10])
print (b)
print ('\n')
print ('兩個(gè)數(shù)組相加')
print (np.add(a,b))
print ('\n')
print ('兩個(gè)數(shù)組相減')
print (np.subtract(a,b))
print ('\n')
print ('兩個(gè)數(shù)組相乘')
print (np.multiply(a,b))
print ('\n')
print ('兩個(gè)數(shù)組 相除:')
print (np.divide(a,b))


第一個(gè)數(shù)組
[[ 0.  1.  2.]
 [ 3.  4.  5.]
 [ 6.  7.  8.]]


第二個(gè)數(shù)組
[10 10 10]


兩個(gè)數(shù)組相加
[[ 10.  11.  12.]
 [ 13.  14.  15.]
 [ 16.  17.  18.]]


兩個(gè)數(shù)組相減
[[-10.  -9.  -8.]
 [ -7.  -6.  -5.]
 [ -4.  -3.  -2.]]


兩個(gè)數(shù)組相乘
[[  0.  10.  20.]
 [ 30.  40.  50.]
 [ 60.  70.  80.]]


兩個(gè)數(shù)組 相除:
[[ 0.   0.1  0.2]
 [ 0.3  0.4  0.5]
 [ 0.6  0.7  0.8]]

numpy.reciprocal()

返回參數(shù)逐元素的倒數(shù), 1/4倒數(shù)4/1

import numpy as np

a = np.array([0.25, 1.33, 1, 100])
print (a)
print ('倒數(shù)')
print (np.reciprocal(a))


[   0.25    1.33    1.    100.  ]
倒數(shù)
[ 4.         0.7518797  1.         0.01     ]

numpy.power()

函數(shù)將第一個(gè)輸入數(shù)組中的元素作為底數(shù), 計(jì)算它與第二個(gè)輸入數(shù)組中相應(yīng)元素的冪

import numpy as np

a = np.array([10,100,1000])
print ('數(shù)組')
print (a)
print ('\n')
print ('調(diào)用power')
print (np.power(a,2))
print ('\n')
print ('第二個(gè)數(shù)組')
b = np.array([1,2,3])
print (b)
print ('再次調(diào)用power函數(shù)')
print (np.power(a,b))

數(shù)組
[  10  100 1000]


調(diào)用power
[    100   10000 1000000]


第二個(gè)數(shù)組
[1 2 3]
再次調(diào)用power函數(shù)
[        10      10000 1000000000]

numpy.mod()

計(jì)算輸入數(shù)組中相應(yīng)元素的相除后的余數(shù), numpy.remainder()也產(chǎn)生相同的結(jié)果

import numpy as np

a = np.array([10,20,30])
b = np.array([3,5,7])
print ('調(diào)用mod')
print (np.mod(a,b))
print ('調(diào)用remainder')
print (np.remainder(a,b))


調(diào)用mod
[1 0 2]
調(diào)用remainder
[1 0 2]

參考教程:菜鳥教程
個(gè)人博客
numpy學(xué)習(xí)(二)

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叹卷,隨后出現(xiàn)的幾起案子撼港,更是在濱河造成了極大的恐慌,老刑警劉巖骤竹,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帝牡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蒙揣,警方通過查閱死者的電腦和手機(jī)靶溜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸣奔,“玉大人墨技,你說我怎么就攤上這事惩阶。” “怎么了扣汪?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵断楷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我崭别,道長(zhǎng)冬筒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任茅主,我火速辦了婚禮舞痰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诀姚。我一直安慰自己响牛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布赫段。 她就那樣靜靜地躺著呀打,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糯笙。 梳的紋絲不亂的頭發(fā)上贬丛,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音给涕,去河邊找鬼豺憔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛够庙,可吹牛的內(nèi)容都是我干的恭应。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼首启,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼暮屡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毅桃,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎准夷,沒想到半個(gè)月后钥飞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衫嵌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年读宙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楔绞。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡结闸,死狀恐怖唇兑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桦锄,我是刑警寧澤扎附,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站结耀,受9級(jí)特大地震影響留夜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜图甜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一碍粥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黑毅,春花似錦嚼摩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匪凡,卻和暖如春膊畴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背病游。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工唇跨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衬衬。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓买猖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親滋尉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玉控,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345