numpy
1颜矿、numpy中創(chuàng)建結構化數(shù)據(jù)
import numpy as np
dt = np.dtype([("age",np.int8)])
a = np.array([(10,),(20,),(30,)],dtype=dt)
print(a["age"])
2.numpy的數(shù)組屬性
屬性 | 說明 |
---|---|
ndarray.ndim | 秩 |
ndarray.shape | 形狀 |
ndarray.size | 元素總個數(shù)m*n |
ndarray.dtype | 元素數(shù)據(jù)類型 |
ndarray.itemsize | 每個元素的大小毕莱,字節(jié)為單位 |
ndarray.flags | ndarray對象的內存信息 |
ndarray.real | ndarray元素的實部 |
ndarray.imag | 元素的虛部 |
ndarray.data | 實際數(shù)組的緩沖區(qū) |
例子
#a是read-only
a= np.array([1,2,3])
a.flags.writeble=False
3.np創(chuàng)建數(shù)組
- np.zeros(shape,dtype=None,order="C")
示例
b=np.zeros((2,2))#默認為浮點數(shù)
a=np.zeros((2,2),dtype=[("x","i4"),("y","i4")])
#array([[(0, 0), (0, 0)],
[(0, 0), (0, 0)]], dtype=[('x', '<i4'), ('y', '<i4')])
- np.ones(shape,dtype,order="F")
- np.asarray(a,dtype=None,order=None) a可以是任意形式的輸入?yún)?shù),列表元組贝搁,列表的元組捷犹,元組的元組耐床,元組的列表,多維數(shù)組置谦。
- np.frombuffer(buffer,dtype=float,count=-1,offset=0)實現(xiàn)動態(tài)數(shù)組堂鲤,以流的形式讀入轉換成ndarray對象.參數(shù)count是讀取的數(shù)據(jù)數(shù)量,-1指全部數(shù)據(jù)媒峡;offset指讀取的起始位置瘟栖。
注意:python3默認str是unicode類型,要在str前加b轉換成bytestring類型谅阿。 - np.fromiter(iterable,dtype,count=-1),從可迭代對象建立ndarray對象半哟。
- np.arange(start,stop,step,dtype)
- np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)創(chuàng)建等差數(shù)列。
- np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)創(chuàng)建等比數(shù)列签餐,base參數(shù)意思是取對數(shù)時候log的下標寓涨。
4.ndarray數(shù)組的切片和索引
- slice(start,stop,step) 相當于直接array[2:7:2]
- np高級索引(整數(shù)數(shù)組索引,布爾索引氯檐,花式索引)
例一:整數(shù)索引
x=np.arange(10).reshape(2,5)
x[[0,1,0,1],[0,1,0,1]]#第一維取行戒良,第二維取列
#array([0, 6, 0, 6])
例二::與...
x[0:1,1:3](左閉右開)
#array([[1, 2]])
x[...,-1:],返回和原二維數(shù)組的維度一致
#array([[4],
[9]])
例三:布爾索引
x[x>5]#返回一維結果
#array([6, 7, 8, 9])
例四:花式索引
花式索引指的是利用整數(shù)數(shù)組進行索引。
花式索引根據(jù)索引數(shù)組的值作為目標數(shù)組的某個軸的下標來取值冠摄。對于使用一維整型數(shù)組作為索引糯崎,如果目標是一維數(shù)組几缭,那么索引的結果就是對應位置的元素;如果目標是二維數(shù)組沃呢,那么就是對應下標的行年栓。
花式索引跟切片不一樣,它總是將數(shù)據(jù)復制到新數(shù)組中
x[[1,0]] 互換第一二行
#array([[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4]])
傳入多個索引數(shù)組(np.ix_)
x[np.ix_([1,0],[2,1,3])]#返回2*3維的二維數(shù)組
#array([[7, 6, 8],
[2, 1, 3]])
5 np的broadcast機制
廣播的規(guī)則:
讓所有輸入數(shù)組都向其中形狀最長的數(shù)組看齊薄霜,形狀中不足的部分都通過在前面加 1 補齊某抓。
輸出數(shù)組的形狀是輸入數(shù)組形狀的各個維度上的最大值。
如果輸入數(shù)組的某個維度和輸出數(shù)組的對應維度的長度相同或者其長度為 1 時惰瓜,這個數(shù)組能夠用來計算否副,否則出錯。
當輸入數(shù)組的某個維度的長度為 1 時鸵熟,沿著此維度運算時都用此維度上的第一組值副编。
簡單理解:對兩個數(shù)組,分別比較他們的每一個維度(若其中一個數(shù)組沒有當前維度則忽略)流强,滿足:
數(shù)組擁有相同形狀。
當前維度的值相等呻待。
當前維度的值有一個是 1打月。
a=np.array(1,2,3,4,5)
x+a
#array([[ 1, 3, 5, 7, 9],
[ 6, 8, 10, 12, 14]])
相當于
x+np.tile(a,(2,1))
6. np迭代數(shù)組
np.nditer進行迭代
x=np.arange(6).reshape(2,3)
list(np.nditer(x))默認的是行序有先
#[array(0), array(1), array(2), array(3), array(4), array(5)]
list(np.nditer(x.T))
#[array(0), array(1), array(2), array(3), array(4), array(5)]
a=x.T.copy(order="C")
list(np.nditer(a))
#[array(0), array(3), array(1), array(4), array(2), array(5)]
從上述例子可以看出,a 和 a.T 的遍歷順序是一樣的蚕捉,也就是他們在內存中的存儲順序也是一樣的奏篙,但是 a.T.copy(order = 'C') 的遍歷結果是不同的,那是因為它和前兩種的存儲方式是不一樣的迫淹,默認是按行訪問秘通。
顯示地使用某種順序
list(np.nditer(x,order="F"))
#[array(0), array(3), array(1), array(4), array(2), array(5)]
外部循環(huán)
nditer類的構造器擁有flags參數(shù),
在下面的實例中敛熬,迭代器遍歷對應于每列肺稀,并組合為一維數(shù)組。
list(np.nditer(x,flags=["external_loop"],order="F"))
[array([0, 3]), array([1, 4]), array([2, 5])]
廣播迭代機制
7. np的數(shù)組操作
大致分為幾類:
- 修改數(shù)組形狀
- 翻轉數(shù)組
- 修改數(shù)組維度
- 鏈接數(shù)組
- 分割數(shù)組
- 數(shù)組元素的添加與刪除
修改數(shù)組形狀
函數(shù) | 說明 |
---|---|
reshape | 不改變數(shù)據(jù)应民,修改形狀 |
flat | 數(shù)組元素迭代器 |
flatten | 返回 一份數(shù)組拷貝 |
ravel | 返回展開數(shù)組 |
翻轉數(shù)組
函數(shù) | 說明 |
---|---|
transpose | 對換數(shù)組的維度 |
.T | 轉置 |
rollaxis | 向后滾動指定的軸 |
swapaxes | 對換數(shù)組的兩個軸 |
例子
#將軸2滾動到軸0
np.rollaxis(a,2,0)
#原始坐標[1,1,0],轉換成[0,1,1]
np.swapaxes(arr,axis1,axis2)#交換軸1和軸2
修改數(shù)組維度
函數(shù) | 說明 |
---|---|
broadcast | 產(chǎn)生模仿廣播的對象 |
broadcast_to | 將數(shù)組廣播到新形狀 |
expand_dims | 擴展數(shù)組形狀 |
squeeze | 從數(shù)組中刪除一維條目 |
鏈接數(shù)組
函數(shù) | 說明 |
---|---|
concatenate | 連接沿現(xiàn)有軸的數(shù)組序列 |
stack | 沿著新的軸加入一系列數(shù)組 |
hstack | 水平堆疊列方向 |
vstack | 豎直堆疊话原,行方向 |
注意
np.stack(arrays,axis),arrays相同形狀的數(shù)組序列,axis返回數(shù)組中的軸诲锹。用于沿新軸連接數(shù)組序列繁仁,會新增一個維度。
分割數(shù)組
函數(shù) | 說明 |
---|---|
split | 將一個數(shù)組分割為多個子數(shù)組 |
hsplit | 將一個數(shù)組水平分割為多個子數(shù)組(按列) |
vsplit | 將一個數(shù)組分割為多個子數(shù)組(按行) |
注意
np.split(arr,indices_or_sections,axis)
a=np.arange(9)
b=np.split(a,[4,7])
#[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
數(shù)組元素的添加和刪除
函數(shù) | 元素及新數(shù)組 |
---|---|
resize | 返回指定形狀的新數(shù)組 |
append | 將值添加到數(shù)組末尾 |
insert | 沿指定軸插入到指定下標之前 |
delete | 刪除某個軸的子數(shù)組归园,并返回新數(shù)組 |
unique | 查找數(shù)組內的唯一元素 |
例子:
np.insert(arr,object,values,axis)
- arr被插入數(shù)據(jù)的數(shù)組
- object插入數(shù)據(jù)的索引位置
- values 要插入的值
- 按照行列進行插入黄虱,未指定時在插入之前的數(shù)組會被展開。
8. np 的位運算
np的"bitwise_"開頭的函數(shù)是位運算函數(shù)庸诱。
函數(shù) | 說明 |
---|---|
bitwise_and | 位與操作 |
bitwise_or | 位或操作 |
invert | 按位取反 |
left_shift | 向左移動二進制表示的位 |
right_shift | 向右移動二進制表示的位 |
9.np的字符串函數(shù)
對dtype的numpy.string_或numpy.unicode_的數(shù)組執(zhí)行向量化字符串操作捻浦,這些函數(shù)在字符數(shù)組類numpy.char中定義
函數(shù) | 說明 |
---|---|
np.char.add() | 對兩個數(shù)組的逐個字符串元素進行連接 |
.multiply() | 返回按元素多重連接后的字符串 |
... | python字符類型的一些方法 |
10. np的數(shù)學公式
三角函數(shù)晤揣,算術運算函數(shù),復數(shù)處理函數(shù)默勾,
np.sin(),cos(),tan(),arctan(),arcsin(),arccos(),
- 舍入函數(shù)
np.around(a,decimals)四舍五入
np.floor()向下取整碉渡。
np.ceil()向上取整。
11. np的排序母剥,條件篩選函數(shù)
np.sort(a,axis,kind,order)
kind:默認為"quicksort"滞诺,"mergesort"歸并排序,“heapsort”堆排序
np.argsort()返回數(shù)組值從小到大的索引值环疼。