numpy多維數組語法

numpy get started

numpy 提供了一種數組類型,高維數組, 提供了數據分析的運算基礎(業務表一般就是二維)

import numpy as np

導入numpy庫,並查看numpy版本

np.version

一、創建Array

1. 使用np.array()由python list創建

C 數組的概念 : 數據類型一致的一個連續的內存空間
python list列表 (C語言說:列表其實就是一個指針數組),列表不要求數據類型一致

numpy的數組:同樣是一個【有序】的,【相同數據類型】的集合

[1, 3.14, ‘helloworld’, student]

參數爲列表:
[1, 4, 2, 5, 3]

numpy設計初衷是用於運算的,所以對數據類型進行統一優化

注意:

  • numpy默認ndarray的所有元素的類型是相同的
  • 如果傳進來的列表中包含不同的類型,則統一爲同一類型,優先級:str>float>int

[1,3.14, ‘hello’]

numpy的數組

array = np.array([1])

array

array

array

nd.array
np.array

import numpy as np

names = [“tom”,“lucy”,“jack”]

array1 = np.array(names)

array1

scores = [1.2, 3.4, 5.6]
array2 = np.array(scores)
array2

age = [15,16,18]
array3 = np.array(age, dtype=np.float32)
array3

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

2. 使用np的routines函數創建

包含以下常見創建方法:

  1. np.ones(shape, dtype=None, order=‘C’)

shape = (m,n) m行n列 二維數組
shape = (m) m個元素的一維數組 [1,2,3]
shape = (m,) m個元素的一維數組

shape = (m, 1) m行1列 二維數組 [[1],[2],[3]]
shape = (1, n) 1行m列 二維數組 [[1,2,3]]

構造一個5行3列的二維數組

np.ones(shape=(5,3), dtype=np.int8)

構造長度爲3的一維數組

np.ones(shape=(3,))

np.ones(shape=(3))

構造一個5行1列的二維數組

np.ones(shape=(5,1))

構造1行3列的二維數組

np.ones(shape=(1,3))

  1. np.zeros(shape, dtype=float, order=‘C’)

np.zeros(shape=(5,6))

np.zeros(shape=(5))

np.zeros(shape=(5,3))

np.zeros(shape=(2,3,4))

  1. np.full(shape, fill_value, dtype=None, order=‘C’)

np.full(shape=(2,3), fill_value=6)

  1. np.eye(N, M=None, k=0, dtype=float)
    對角線爲1其他的位置爲0

單位矩陣 l2正則項

生成一個3階單位矩陣(矩陣除法)

np.eye(N=3)

np.eye(N=5, M=4)

np.eye(N=5, k=-1)

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

等差數列

np.linspace(0,10,10, endpoint=False)

  1. np.arange([start, ]stop, [step, ]dtype=None)

np.arange(0,10,step=1)

  1. np.random.randint(low, high=None, size=None, dtype=‘l’)

size 同 shape

np.random.randint(0,100,size=(5,5))

  1. 正態分佈函數
  • np.random.randn(d0, d1, …, dn) 標準正態分佈
  • np.random.normal() 普通正態分佈

np.random.randn(3,5)

np.random.normal(loc=170, scale=5, size=(5,3))

  1. np.random.random(size=None)

生成0到1的隨機數,左閉右開

np.random.random(size=(5,5))

生成一組隨機索引

np.random.permutation(10)

二、ndarray的屬性

4個必記參數:

  • ndim:維度
  • shape:形狀(各維度的長度)
  • size:總長度
  • dtype:元素類型

arr = np.random.randint(0,100,size=(5,4,3))

arr.ndim

arr.shape

arr.size

獲取數組元素類型

arr.dtype

獲取數組類型

type(arr)

創建
屬性
如何訪問
如何計算

三、ndarray的基本操作

data = [[1,2,3],[4,5,6]]

data[0]

data[0][0]

1. 索引

一維與列表完全一致
多維時同理

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

arr1[0]

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

列表的訪問方式

arr2[0][0]

numpy特有的

arr[m,n…] 描述的是對應維度的索引值

arr2[0,0]

arr2[1,2]

高級用法

arr1

1. 使用列表作爲索引訪問

arr1[[0,1,2,0,1,2]]

2. 使用BOOL列表作爲索引訪問, True對應的值會被返回

bool_list = [True, False, True, False, True]
arr1[bool_list]

eg.獲取數組中大於5的數

arr1[arr1 > 3]

arr3 = np.random.randint(0,10,size=(5,4,3))
arr3

arr3[2,0]

arr3[0,1,2]

賦值和訪問沒有區別,都可以使用

2. 切片

一維與列表完全一致
多維時同理

所有的切片方式都是開區間(左閉右開)

arr1[0:3]

arr2 = np.random.randint(0,100,size=(5,6))
arr2

行切片

arr2[0:2]

列切片 不論多少維,每一個維度的切片範圍都是用冒號表示,使用逗號分割,最後一個維度可以省略,但是被切片的維度之前的維度不能省

arr2[:,0:2]

arr3 = np.random.randint(0,10,size=(3,4,5))
arr3

切前兩個數組

arr3[0:2]

切割每一個二維數組的前兩列

arr3[:,:,0:2]

切割每一個二維數組的前兩行

arr3[:,0:2]

將數據反轉,例如[1,2,3]---->[3,2,1]

arr1[::-1]

arr2

arr2[::-1]

arr2[:,::-1]

兩個::進行切片

3. 變形

使用reshape函數,注意參數是一個tuple!

arr = np.random.randint(0,10,size=(20))
arr

arr.reshape((4,5))

arr.reshape(3,7)

4. 級聯

  1. np.concatenate()
    級聯需要注意的點:
  • 級聯的參數是列表:一定要加中括號或小括號
  • 維度必須相同
  • 形狀相符
  • 【重點】級聯的方向默認是shape這個tuple的第一個值所代表的維度方向
  • 可通過axis參數改變級聯的方向

arr1 = np.random.randint(0,10,size=(3,3))
arr2 = np.random.randint(10,20,size=(3,3))

display(arr1, arr2)

使用axis控制連接方向,axis指的是連接的維度

axis 注意軸 非常常見

np.concatenate((arr1, arr2), axis=1)

  1. np.hstack與np.vstack
    水平級聯與垂直級聯,處理自己,進行維度的變更

horizontal

np.hstack((arr1, arr2))

vertical

np.vstack((arr1, arr2))

【注意】:級聯的時候
如果是橫向級聯,參與級聯的數組的行數要一致
縱向級聯,參與級聯的數組的列數要一致
如果是高維數組的級聯,級聯的維度的數據個數要一致

5. 切分

與級聯類似,三個函數完成切分工作:

  • np.split
  • np.vsplit
  • np.hsplit

arr = np.random.randint(0,100,size=(6,6))
arr

直接指定切分的份數

part1, part2 = np.split(arr, indices_or_sections=2)
display(part1, part2)

使用axis控制切分方向

part1, part2, part3 = np.split(arr, indices_or_sections=3, axis=1)
display(part1, part2, part3)

arr2 = np.random.randint(0,100,size=(3,7))
arr2

indices_or_sections=[m,n] 表示的範圍是0:m, m:n, n:

part1, part2, part3 = np.split(arr2, indices_or_sections=[2,5], axis=1)
display(part1, part2, part3)

np.hsplit(arr2, indices_or_sections=[2,5])

6. 副本

所有賦值運算不會爲ndarray的任何元素創建副本。對賦值後的對象的操作也對原來的對象生效。

可使用copy()函數創建副本

copy_array = arr.copy()

arr

copy_array[0,0] = 1000

arr

copy_array

四、ndarray的聚合操作

arr

1. 求和np.sum

arr = np.random.randint(0,10,size=10)
arr

arr.sum()

求平均值

arr.mean()

arr.max()

arr.min()

求最大值索引

arr.argmax()

arr

arr.argmin()

標準方差

arr.std()

求方差

arr.var()

arr

注意這個語法格式

np.median(arr)

arr.median()

data = np.arange(0,11,step=1)
data

第一個參數是要求百分位數的數據

第二個參數是要求的百分位的位置

異常值檢測會使用Q1 Q3

np.percentile(data, [0.25, 0.75])

平均值 (d1 + d2 + d3 + … dn)/n
中位數
方差 (d1-mean)**2 + (d2-mean)**2 + … + (dn-mean)**2/n
標註差 sqrt(方差)

any 檢測一個BOOL數組中,是否至少存在一個True

all 檢測一個BOOL數組中,是否全爲True

bool_list = np.array([False, True, False, False])
bool_list.any()

bool_list = np.array([True, True, True, True])
bool_list.all()

a = 10

a > 10

找出一組數據中,所有大於該組數據平均值的值

arr

廣播運算, 支持一個numpy.arry和任意一個數運算

condition = arr > arr.mean()
condition

arr[condition]

查看一個數組中,是否存在至少一個大於10的數

(arr > 10).any()

2. 最大最小值:np.max/ np.min

同理

any() 有True返回True

all() 有False返回False

3. 其他聚合操作

Function Name	NaN-safe Version	Description
np.sum	np.nansum	Compute sum of elements
np.prod	np.nanprod	Compute product of elements
np.mean	np.nanmean	Compute mean of elements
np.std	np.nanstd	Compute standard deviation
np.var	np.nanvar	Compute variance
np.min	np.nanmin	Find minimum value
np.max	np.nanmax	Find maximum value
np.argmin	np.nanargmin	Find index of minimum value
np.argmax	np.nanargmax	Find index of maximum value
np.median	np.nanmedian	Compute median of elements
np.percentile	np.nanpercentile	Compute rank-based statistics of elements
np.any	N/A	Evaluate whether any elements are true
np.all	N/A	Evaluate whether all elements are true
np.power 冪運算

np.sum 和 np.nansum 的區別
nan not a number

五、ndarray的矩陣操作

1. 基本矩陣操作

  1. 算術運算符:
  • 加減乘除
  1. 矩陣積np.dot()

a = np.array([[1,2],[3,4]])
b = np.array([[1,1],[2,2]])
display(a, b)

使用符號是對應位置相乘

a * b

如果希望做數學中的矩陣運算

np.dot(a, b)

2. 廣播機制

arr

3 3 3 3 3 3 3 3 3 3 3

arr = np.array([1,2,3,4,5])
data = 3

arr + data

【重要】ndarray廣播機制的兩條規則

  • 規則一:爲缺失的維度補1
  • 規則二:假定缺失元素用已有值填充

例1:
m = np.ones((2, 3))
a = np.arange(3)
求M+a

m = np.ones((2,3))
a = np.arange(3)
display(m, a)

m + a

m + 3

不能廣播運算的例子

m = np.ones(shape=(3,3))
n = np.array([[1,2],[3,4]])
display(m, n)

m + n

例2:
a = np.arange(3).reshape((3, 1))
b = np.arange(3)
求a+b

a = np.arange(0,3,step=1).reshape((3, 1))
b = np.arange(3)
display(a, b)

a + b

習題
a = np.ones((4, 1))
b = np.arange(4)
求a+b

六、ndarray的排序

小測驗:
使用以上所學numpy的知識,對一個ndarray對象進行冒泡排序。
def bubleSort(x):
代碼越短越好

1. 快速排序

np.sort()與ndarray.sort()都可以,但有區別:

  • np.sort()不改變輸入
  • ndarray.sort()本地處理,不佔用空間,但改變輸入

data = np.random.permutation(10)
data

data.sort()

data

np.sort(data)

2. 部分排序

np.partition(a,k)

有的時候我們不是對全部數據感興趣,我們可能只對最小或最大的一部分感興趣。

  • 當k爲正時,我們想要得到最小的k個數
  • 當k爲負時,我們想要得到最大的k個數

data = np.random.permutation(10000)
data

np.partition(data, 4)[:4]

np.partition(data,-4)[-4:]在這裏插入代碼片

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章