Python 數據分析之 Numpy (三)

作者:小蝸牛愛學習
來源:https://blog.csdn.net/qq_42755939/article/details/107091694

一、數組的拼接

1、豎向拼接vstack()

import numpy as np
import matplotlib.pyplot as plt


arr1 = np.arange(1,10).reshape(3,3)
arr2 = np.arange(10,19).reshape(3,3)

print(arr1)#[[1 2 3] [4 5 6] [7 8 9]]
print(arr2)#[[10 11 12] [13 14 15] [16 17 18]]
arr3 = np.vstack((arr1,arr2)) #vertically:垂直地
print(arr3) 

結果如下:

[
[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]
[16 17 18]
]

2、橫向拼接hstack()

arr4 = np.hstack((arr1,arr2)) #horizontall:水平的
print(arr4)

結果如下:

[
[ 1 2 3 10 11 12]
[ 4 5 6 13 14 15]
[ 7 8 9 16 17 18]
]

二、數組的行列交換

數組水平或者豎直拼接很簡單,但是拼接之前應該注意什麼?
豎直拼接的時候:每一列代表的意義相同!!!

如果每一列的意義不同,這個時候應該交換某一組的數的列,讓其和另外一類相同

1、行之間的交換

t1 = np.arange(18).reshape(6,3)
print(t1)
結果:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]
 [12 13 14]
 [15 16 17]]

t1[[1,3],:] = t1[[3,1],:]
print(t1)
結果:
[[ 0  1  2]
 [ 9 10 11]
 [ 6  7  8]
 [ 3  4  5]
 [12 13 14]
 [15 16 17]]

2、列之間的交換

t2 = np.arange(18).reshape(3,6)
print(t2)
#[[ 0  1  2  3  4  5]
# [ 6  7  8  9 10 11]
# [12 13 14 15 16 17]]

t2[:,[2,3]] = t2[:,[3,2]]
print(t2)
#[[ 0  1  3  2  4  5]
# [ 6  7  9  8 10 11]
# [12 13 15 14 16 17]]

三、Numpy更多的方法

1、獲取最大值最小值的位置

np.argmax(t,axis=0)

np.argmin(t,axis=1)

a1 = np.array([[  20.,   1.,   22.,   3.,   4.,   50.],
       [  6.,   7.,  5,   9.,  10.,  11.],
       [ 12.,  13.,  14.,  20,  16.,  17.],
       [ 18.,  19.,  20.,  21.,  22.,  23.]])

max_index = np.argmax(a1,axis = 0)#找到每列的最大值位置
print(max_index)#[0 3 0 3 3 0]
min_index = np.argmin(a1,axis = 1)#找到每行最大值的位置
print(min_index)#[1 2 0 0]

2、創建一個全0的數組

a2 = np.zeros((2,3))
print(a2)#[[0. 0. 0.] [0. 0. 0.]]

3、創建一個全1的數組

a3 = np.ones((3,4))
print(a3)
#[[1. 1. 1. 1.]
# [1. 1. 1. 1.]
# [1. 1. 1. 1.]]

4、創建一個對角線爲1的正方形數組(方陣)

a4 = np.eye(3)
print(a4)
#[[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]

四、Numpy生成隨機數

在numpy中有一個強大的隨機數模塊–random它主要有四個部分:

  1. 生成器:種隨機數種子,根據同一種子產生的隨機數是相同的
  2. 簡單隨機數: 產生簡單的隨機數據,可以是任何維度
  3. 分佈:產生指定分佈的數據,如高斯分佈等
  4. 排列:將所給對象隨機排列

1、生成器

電腦是如何產生隨機數的:

(1)隨機數是由隨機種子根據一定的計算方法計算出來的數值。所以,只要計算方法一定,隨機種子一定,那麼產生的隨機數就不會變。

(2)只要用戶不設置隨機種子,那麼在默認情況下隨機種子來自系統時鐘(即定時/計數器的值)

(3)隨機數產生的算法與系統有關,Windows和Linux是不同的,也就是說,即便是隨機種子一樣,不同系統產生的隨機數也不一樣。

numpy.random 設置種子的方法有:

函數名稱 函數功能 參數說明
RandomState 定義種子類 RandomState是一個種子類,提供了各種種子方法,最常用seed
seed([seed]) 定義全局種子 參數爲整數或者矩陣
np.random.seed(1) #設置隨機種子爲1
arr1 = np.random.rand(2,3)
np.random.seed(1234)
arr2 = np.random.rand(2,3)
print(arr1) #[[0.19151945 0.62210877 0.43772774 [0.78535858 0.77997581 0.27259261]]
print(arr2) #[[0.19151945 0.62210877 0.43772774] [0.78535858 0.77997581 0.27259261]]

2、簡單隨機數

函數名稱 函數功能 參數說明
rand(d0, d1, …, dn) 產生均勻分佈的隨機數 dn爲第n維數據的維度
randn(d0, d1, …, dn) 產生標準正態分佈隨機數 dn爲第n維數據的維度
randint(low, high, size, dtype) 產生隨機整數 low:最小值;high:最大值;size:數據個數
random_sample([size]) 在[0,1)內產生隨機數 size:隨機數的shape,可以爲元祖或者列表,[2,3]表示2維隨機數,維度爲(2,3)
random([size]) 同random_sample([size]) 同random_sample([size])
ranf([size]) 同上 同上
sample([size])) 同上 同上
np.random.choice(a, size=None, replace=True, p=None) 從一維array a 或 int 數字a 中,以概率p隨機選取大小爲size的數據 replace表示是否重用元素,即抽取出來的數據是否放回原數組中,默認爲true(抽取出來的數據有重複)
bytes(length) 返回隨機位 length:位的長度
#1、產生2行3列均勻分佈的隨機數組
a1 = np.random.rand(2,3)
print("a1:",a1)#a1:[[0.27646426 0.80187218 0.95813935] [0.87593263 0.35781727 0.50099513]]

#2、產生2行3列的正太分佈隨機數組
a2 = np.random.randn(2,3)
print("a2:",a2)#a2:[[ 1.15003572  0.99194602  0.95332413] [-2.02125482 -0.33407737  0.00211836]]

#3、產生一個[-10,10)之間2行3列的隨機整數數組
a3 = np.random.randint(-10,10,[2,3],dtype="int")
print("a3:",a3)#a3:[[ -8  -4  -7] [ -3   1 -10]]

#4、產生2[0,1)之間的2行3列浮點型隨機數組
a4 = np.random.random([2,3])
print("a4:",a4) #a4:[[0.88922613 0.9871393  0.11744339] [0.39378235 0.45272981 0.53814784]]

3、分佈

函數名稱 函數功能 參數說明
beta(a, b[, size]) 貝塔分佈樣本,在 [0, 1]內。
binomial(n, p[, size]) 二項分佈的樣本。
chisquare(df[, size]) 卡方分佈樣本。
dirichlet(alpha[, size]) 狄利克雷分佈樣本。
exponential([scale, size]) 指數分佈
f(dfnum, dfden[, size]) F分佈樣本。
gamma(shape[, scale, size]) 伽馬分佈
geometric(p[, size]) 幾何分佈
gumbel([loc, scale, size]) 耿貝爾分佈。
hypergeometric(ngood, nbad, nsample[, size]) 超幾何分佈樣本。
laplace([loc, scale, size]) 拉普拉斯或雙指數分佈樣本
logistic([loc, scale, size]) Logistic分佈樣本
lognormal([mean, sigma, size]) 對數正態分佈
logseries(p[, size]) 對數級數分佈。
multinomial(n, pvals[, size]) 多項分佈
multivariate_normal(mean, cov[, size]) 多元正態分佈。
negative_binomial(n, p[, size]) 負二項分佈
noncentral_chisquare(df, nonc[, size]) 非中心卡方分佈
noncentral_f(dfnum, dfden, nonc[, size]) 非中心F分佈
normal([loc, scale, size]) 正態(高斯)分佈
pareto(a[, size]) 帕累託(Lomax)分佈
poisson([lam, size]) 泊松分佈
power(a[, size]) Draws samples in [0, 1] from a power distribution with positive exponent a - 1.
rayleigh([scale, size]) Rayleigh 分佈
standard_cauchy([size]) 標準柯西分佈
standard_exponential([size]) 標準的指數分佈
standard_gamma(shape[, size]) 標準伽馬分佈
standard_normal([size]) 標準正態分佈 (mean=0, stdev=1).
standard_t(df[, size]) Standard Student’s t distribution with df degrees of freedom.
triangular(left, mode, right[, size]) 三角形分佈
uniform([low, high, size]) 均勻分佈
vonmises(mu, kappa[, size]) von Mises分佈
wald(mean, scale[, size]) 瓦爾德(逆高斯)分佈
weibull(a[, size]) Weibull 分佈
zipf(a[, size]) 齊普夫分佈
#(1)正態分佈
mu = 3  #期望爲1
sigma = 3  #標準差爲3
num = 100000  #個數爲10000

rand_data = np.random.normal(mu, sigma, num)
print(rand_data)
count, bins, ignored = plt.hist(rand_data, 30, normed=True)
plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (bins - mu)**2 / (2 * sigma**2)), linewidth=2, color='r')
plt.show()

正太分佈圖:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dDrsviuv-1593821554872)(C:\Users\wxukui\AppData\Roaming\Typora\typora-user-images\1593686505328.png)]

4、排列

函數名稱 函數功能 參數說明
shuffle(x) 打亂對象x(多維矩陣按照第一維打亂) 矩陣或者列表
permutation(x) 打亂並返回該對象(多維矩陣按照第一維打亂) 整數或者矩陣
data = np.random.randint(1, 6, (2,3))
print(data) #[[4 1 2] [2 4 2]]
np.random.shuffle(data)
print(data) #[[2 4 2] [4 1 2]]

五、Numpy中賦值、視圖、深複製

1、賦值

當對numpy數組進行賦值時,只是對同一個對象新建了一個引用,並不是建立新的對象,
所以賦值前後的變量完全是同一對象,對其中一個引用修改時,所有引用都會生效

a = np.arange(5)
b = a # 賦值
print(a is b) #True

2、視圖(切片、淺複製)

numpy中允許不同數組間共享數據,這種機制在numpy中稱爲視圖,
對numpy數組的切片和淺複製都是通過視圖實現的。如果數組B是數組A的視圖(view),
則稱A爲B的base(除非A也是視圖)。視圖數組中的數據實際上保存在base數組中。

a = np.arange(6)
b = a.view()    #使用視圖
print(a is b)  #False

b = b.reshape((2,3))#改變視圖的形狀
print(a) #[0 1 2 3 4 5]
print(b) #[[0 1 2] [3 4 5]]
#可見改變視圖形狀不會影響base

b = a.view()
b[b>3] = 3 #改變b的數值
print(a)#[0 1 2 3 3 3]
print(b)#[0 1 2 3 3 3]
#可見改變視圖數據會影響base,所以他們是共享數據的

#切片
a = np.arange(12).reshape(3,4)
b = a[:]
print(a is b)#False

#改變b的形狀
b = b.reshape(2,6)
print(a)#[[ 0  1  2  3] [ 4  5  6  7] [ 8  9 10 11]]
print(b)#[[ 0  1  2  3  4  5] [ 6  7  8  9 10 11]]

#改變b的數值
b = a[:]
b[b>10] = 10
print(a)#[[ 0  1  2  3] [ 4  5  6  7] [ 8  9 10 10]]
print(b)#[[ 0  1  2  3] [ 4  5  6  7] [ 8  9 10 10]]
#切片效果與視圖一致,其實切片就是視圖

3、深複製

深複製通過數組自帶的copy()方法實現,深複製產生的數組與原數組時完全不同的兩個數組對象,
完全享有獨立的內存空間,所有操作都不會相互影響。

c = np.arange(12).reshape(3,4)
d = c.copy()
print(c is d) #False
c = c.reshape(2,6)#改變c的形狀
print(c)#[[ 0  1  2  3] [ 4  5  6  7] [ 8  9 10 11]]
print(d)#[[ 0  1  2  3  4  5] [ 6  7  8  9 10 11]]
d[d>7]=7
print(c) #[[ 0  1  2  3  4  5] [ 6  7  8  9 10 11]]
print(d)#[[0 1 2 3] [4 5 6 7] [7 7 7 7]]

推薦閱讀:


關注微信公衆號『傑哥的IT之旅』,後臺回覆“1024”查看更多內容,回覆“微信”添加我微信。

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