主頁 > 後端開發 > numpy學習總結

numpy學習總結

2021-10-05 08:51:19 後端開發

高效學習NumPy基礎

  • 創建陣列
    • numpy.array(object, dtype,copy, order, subox, ndmin)
    • numpy.arange(start, stop, step, dtype)
    • numpy.linspace(start, stop, num)
    • numpy.logspase(start,stop,num)
    • numpy.zeros(shape,dtype,order)
    • numpy.eye(N,M, K,dtype,order)
    • numpy.diag(V,K)
    • numpy.ones(shape,dtype, order)
  • 陣列物件的屬性
  • 陣列資料型別
    • 基本資料型別
    • 型別轉換
    • 創建資料型別
    • 查看資料型別
    • 自定義陣列資料
  • 生成亂數
    • random模塊的常用亂數生成函式
  • 通過索引訪問陣列
    • 一維陣列的索引
    • 多維陣列的索引
    • 使用整數函式和布林值索引訪問多維陣列
  • 變換陣列的形態
    • reshape()改變陣列形狀
    • ravel()展平陣列
    • flatten()展平陣列
    • hstack()橫向合并陣列
    • vstack()縱向合并陣列
    • concatenate()合并陣列
    • hsplit()橫向分割陣列
    • vsplit()縱向分割陣列
    • split()分割陣列
  • 創建NumPy矩陣
    • 矩陣創建
    • 矩陣運算
    • 矩陣屬性
  • ufunc函式
    • 常用的函式
    • 常用的ufunc函式運算
    • 廣播機制
  • 檔案操作
    • 資料存盤
    • 檔案讀取
    • txt格式保存與讀取
    • genfromtxt函式讀取資料
  • 排序
    • sort函式 無回傳值 直接對原始資料修改
    • argsort函式
    • lexsort函式
  • 去重與生成重復資料
  • 常用的統計函式

NumPy提供了兩種基本物件:ndarrayufunc,ndarray稱為陣列,而ufunc則是對陣列進行處理的函式

創建陣列

numpy.array(object, dtype,copy, order, subox, ndmin)

用于創建NumPy陣列

import numpy as np
"""
array(object, dtype=None, copy=True, order='K', subox=False, ndmin=0)
引數說明:

object : 陣列,公開陣列介面的任何物件,__array__方法回傳陣列的物件,或任何(嵌套)序列,
 
dtype : 資料型別,陣列所需的資料型別,如果沒有給出,那么型別將被確定為保持序列中的物件所需的最小型別,此引數只能用于“upcast”陣列,對于向下轉換,請使用.astype(t)方法,

copy : 如果為True(默認值),則復制物件,否則,只有當__array__回傳副本,obj是嵌套序列,或者需要副本來滿足任何其他要求(dtype,順序等)時,才會進行復制,

order : 英文字母,引數可寫{'K','A','C','F'},指定陣列的記憶體布局,如果object不是陣列,則新創建的陣列將按C順序排列(行主要),除非指定了'F',在這種情況下,它將采用Fortran順序(專業列),如果object是一個陣列,則以下成立,當copy=False出于其他原因而復制時,結果copy=True與對A的一些例外情況相同,請參閱“注釋”部分,默認順序為“K”,

subok : boolean值,如果為True,則子類將被傳遞,否則回傳的陣列將被強制為基類陣列(默認),

ndmin : int值,指定結果陣列應具有的最小維數,根據需要,將根據需要預先設定形狀,

滿足要求的陣列物件

"""
# 創建一個陣列 主要引數 object、dtype、ndmin,
a1 = np.array([1,2,3])
a2 = np.array([1,2,3], dtype=float)
a3 = np.array([1,2,3], ndmin=2)
print(a1)
print(a2)
print(a3)

運行結果:

[1 2 3]

[1. 2. 3.]

[[1 2 3]]

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

在給定間隔內回傳均勻間隔的值,左閉右開區間 [起始值,終止值)

import numpy as np
# 用array(range(10)) 生成0-9的的int型別陣列
a1 = np.array(range(10))
"""
numpy.arange(start, stop, step, dtype=None)
參數說明:
start 起始值
stop 終止值 生成的范圍到終止值-1 例如(0,10) 生成0~9
step 步長
dtype 資料型別
"""
# a1和a2的效果一樣
a2 = np.arange(10)
a3 = np.arange(0, 10)
a4 = np.arange(0, 10, 2)
a5 = np.arange(0, 10, 2, float)
print(a1)
print(a2)
print(a3)
print(a4)
print(a5)

運行結果:

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

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

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

[0 2 4 6 8]

[0. 2. 4. 6. 8.]

numpy.linspace(start, stop, num)

用于回傳間隔類均勻分布的數值序列,閉區間 [起始值,終止值]

import numpy as np
"""
numpy.linspace(start, stop, num)
引數說明:
start 起始值
stop 終止值
num 數量 默認值為50
"""
a1 = np.linspace(0,10)
a2 = np.linspace(0,10, 5)
print(a1)
print(a2)

運行結果:

[ 0.          0.20408163  0.40816327  0.6122449   0.81632653  1.02040816
  1.2244898   1.42857143  1.63265306  1.83673469  2.04081633  2.24489796
  2.44897959  2.65306122  2.85714286  3.06122449  3.26530612  3.46938776
  3.67346939  3.87755102  4.08163265  4.28571429  4.48979592  4.69387755
  4.89795918  5.10204082  5.30612245  5.51020408  5.71428571  5.91836735
  6.12244898  6.32653061  6.53061224  6.73469388  6.93877551  7.14285714
  7.34693878  7.55102041  7.75510204  7.95918367  8.16326531  8.36734694
  8.57142857  8.7755102   8.97959184  9.18367347  9.3877551   9.59183673
  9.79591837 10.        ]
  
[ 0.   2.5  5.   7.5 10. ]

numpy.logspase(start,stop,num)

用于回傳間隔類均勻分布的等比數列,閉區間 [起始值,終止值]

"""
numpy.logspace(start, stop, num)
引數說明:
start 起始值
stop 終止值
num 數量 默認值為50
"""
a1 = np.logspace(0,2)
a2 = np.logspace(0,2, 5)
print(a1)
print(a2)

運行結果:

[  1.           1.09854114   1.20679264   1.32571137   1.45634848
   1.59985872   1.75751062   1.93069773   2.12095089   2.32995181
   2.55954792   2.8117687    3.0888436    3.39322177   3.72759372
   4.09491506   4.49843267   4.94171336   5.42867544   5.96362332
   6.55128557   7.19685673   7.90604321   8.68511374   9.54095476
  10.48113134  11.51395399  12.64855217  13.89495494  15.26417967
  16.76832937  18.42069969  20.23589648  22.22996483  24.42053095
  26.82695795  29.47051703  32.37457543  35.56480306  39.06939937
  42.9193426   47.14866363  51.79474679  56.89866029  62.50551925
  68.6648845   75.43120063  82.86427729  91.0298178  100.        ]
  
[  1.           3.16227766  10.          31.6227766  100.        ]

numpy.zeros(shape,dtype,order)

用于創建值全部為0的陣列,即創建的陣列元素全部為0

"""
numpy.zeros(shape, dtype, order)
引數說明:
shape 陣列的維度
dtype 資料型別
order 指定陣列的記憶體布局
"""
a1 = np.zeros((5,5), dtype=int)
a2 = np.zeros((5,5), dtype=float)
print(a1)
print(a2)

運行結果:

[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
 
[[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]

numpy.eye(N,M, K,dtype,order)

用于生成主對角線為1,其余元素為0的陣列

"""
numpy.eye(N,M, K,dtype,order)
引數說明:
N 陣列的行數
M 陣列的列數 不寫默認為N
K 對角線的索引:0(默認值)指的是主對角線,正值指的是上對角線,負值指的是下對角線,
dtype 資料型別
order 指定陣列的記憶體布局
"""
a1 = np.eye(5, dtype=int)
a2 = np.eye(2, 3, dtype=int)
a3 = np.eye(5, 5, 0, dtype=int)
a4 = np.eye(5, 5, 1, dtype=int)
a5 = np.eye(5, 5, -1, dtype=int)
print(a1)
print(a2)
print(a3)
print(a4)
print(a5)

運行結果:

[[1 0 0 0 0]
 [0 1 0 0 0]
 [0 0 1 0 0]
 [0 0 0 1 0]
 [0 0 0 0 1]]
 
[[1 0 0]
 [0 1 0]]
 
[[1 0 0 0 0]
 [0 1 0 0 0]
 [0 0 1 0 0]
 [0 0 0 1 0]
 [0 0 0 0 1]]
 
[[0 1 0 0 0]
 [0 0 1 0 0]
 [0 0 0 1 0]
 [0 0 0 0 1]
 [0 0 0 0 0]]
 
[[0 0 0 0 0]
 [1 0 0 0 0]
 [0 1 0 0 0]
 [0 0 1 0 0]
 [0 0 0 1 0]]

numpy.diag(V,K)

除了對角線以外的其他元素為0, 對角線上的元素可以是0或其他值

"""
numpy.diag(V, K)
引數說明:
V   如果是2D陣列,回傳k位置的對角線,
    如果是1D陣列,回傳一個v作為k位置對角線的2維陣列,
K   對角線的位置,大于零位于對角線上面,小于零則在下面,
"""
a1 = np.diag([1,2,3,4])
a2 = np.diag([1,2,3,4,5], 0)
a3 = np.diag([1,2,3,4,5], 1)
a4 = np.diag([1,2,3,4,5], -1)
print(a1)
print(a2)
print(a3)
print(a4)

運行結果:

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

numpy.ones(shape,dtype, order)

用于創建元素全部為1的陣列

"""
numpy.ones(shape, dtype, order)
引數說明:
shape 陣列的維度
dtype 資料型別
order 指定陣列的記憶體布局
"""
a1 = np.ones((3,4), dtype=int)
a2 = np.ones((4,4), dtype=float)
print(a1)
print(a2)

運行結果:

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

陣列物件的屬性

屬性說明
ndarray.ndim秩,即軸的數量或維度的數量
ndarray.shape陣列的維度,對于矩陣,n 行 m 列
ndarray.size陣列元素的總個數,相當于 .shape 中 n*m 的值
ndarray.dtypendarray 物件的元素型別
ndarray.itemsizendarray 物件中每個元素的大小,以位元組為單位
ndarray.flagsndarray 物件的記憶體資訊
ndarray.realndarray元素的實部
ndarray.imagndarray 元素的虛部
ndarray.data包含實際陣列元素的緩沖區,由于一般通過陣列的索引獲取元素,所以通常不需要使用這個屬性,
import numpy as np
"""
陣列物件的屬性
ndarray.ndim	秩,即軸的數量或維度的數量
ndarray.shape	陣列的維度,對于矩陣,n 行 m 列
ndarray.size	陣列元素的總個數,相當于 .shape 中 n*m 的值
ndarray.dtype	ndarray 物件的元素型別
ndarray.itemsize	ndarray 物件中每個元素的大小,以位元組為單位
ndarray.flags	ndarray 物件的記憶體資訊
ndarray.real	ndarray元素的實部
ndarray.imag	ndarray 元素的虛部
ndarray.data	包含實際陣列元素的緩沖區,由于一般通過陣列的索引獲取元素,所以通常不需要使用這個屬性,
"""
a1 = np.array([[1,2,3], [4,5,6], [7,8,9]])
print("ndim:", a1.ndim)
print("shape:", a1.shape)
print("size:", a1.size)
print("dtype:", a1.dtype)
print("itemsize:", a1.itemsize)
"""
C_CONTIGUOUS (C)	資料是在一個單一的C風格的連續段中
F_CONTIGUOUS (F)	資料是在一個單一的Fortran風格的連續段中
OWNDATA (O)	陣列擁有它所使用的記憶體或從另一個物件中借用它
WRITEABLE (W)	資料區域可以被寫入,將該值設定為 False,則資料為只讀
ALIGNED (A)	資料和所有元素都適當地對齊到硬體上
UPDATEIFCOPY (U)	這個陣列是其它陣列的一個副本,當這個陣列被釋放時,原陣列的內容將被更新
"""
print("flags:", a1.flags)
print("real:", a1.real)
print("imag:", a1.imag)
print("data:", a1.data)

運行結果:

ndim: 2
shape: (3, 3)
size: 9
dtype: int32
itemsize: 4
flags:   C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

real: [[1 2 3]
 [4 5 6]
 [7 8 9]]
imag: [[0 0 0]
 [0 0 0]
 [0 0 0]]
data: <memory at 0x000001D1BDE91860>

陣列資料型別

基本資料型別

轉載至https://www.cnblogs.com/mengxiaoleng/p/11616270.html
在這里插入圖片描述
在這里插入圖片描述

型別轉換

語法:numpy.資料型別(object)

# 整型轉換為浮點型
print("整型轉換為浮點型:", np.float64(66))
# 浮點型轉換為整型
print("浮點型轉換為整型:", np.int8(66.66))
# 整型轉換為布爾型 0為False 其他數為True
print("整型轉換為布爾型:", np.bool(0))
# 布爾型轉浮點型 True為1.0 False為0.0
print("布爾型轉浮點型:", np.float64(True))
"""
運行結果:
整型轉換為浮點型: 66.0
浮點型轉換為整型: 66
整型轉換為布爾型: False
布爾型轉浮點型: 1.0
"""

創建資料型別

語法:numpy.dtype([(name, dtype, [size]),(name, dtype)…])

"""
創建一個資料型別,存盤圖書資訊
需求:
1.能存盤50個字符的字串   記錄書名
2.用一個64位的整數         記錄庫存
3.用一個64位的單精度浮點數 記錄價格
"""
book_type = np.dtype([("name", np.str_, 50), ("count", np.int64), ("price", np.float64)])
print("資料型別為:", book_type)

運行結果:

資料型別為: [('name', '<U50'), ('count', '<i8'), ('price', '<f8')]

查看資料型別

語法:直接當作字典訪問或numpy.dtype()

# 直接訪問
print("圖書名字的資料型別:", book_type["name"])
# numpy.dtype()
print("圖書數量的資料型別:", np.dtype(book_type["count"]))

運行結果:

圖書名字的資料型別: <U50
圖書數量的資料型別: int64

自定義陣列資料

在使用array函式創建陣列時,自定義陣列資料,可以預先自定資料型別,而默認是浮點型,

items = np.array([("華為應用開發中級", 88, 79.00), ("Python語言程式設計", 50, 49.80)], dtype=book_type)
print("自定義資料為:", items)

運行結果:

自定義資料為: [('華為應用開發中級', 88, 79. ) ('Python語言程式設計', 50, 49.8)]

生成亂數

# rand函式生成的均勻分布的亂數 引數:size
a1 = np.random.rand(1, 2)
a2 = np.random.rand(1, 2, 3, 4)
print("rand函式生成的均勻分布的亂數:")
print(a1)
print(a2)
print("-"*50)

# randn函式生成具有標準正態分布的亂數 引數:size
a3 = np.random.randn(1, 2)
a4 = np.random.randn(1, 2, 3, 4)
print("randn函式生成具有標準正態分布的亂數:")
print(a3)
print(a4)
print("-"*50)

# randint函式生成[low, high)區間的隨機整數 引數:low, high, size, dtype
a5 = np.random.randint(1, 10, [1, 2], dtype="short")
a6 = np.random.randint(1, 10, [1, 2, 3], dtype="long")
print("randint函式生成[low, high)區間的隨機整數:")
print(a5, a5.dtype)
print(a6, a6.dtype)
print("-"*50)

# random_sample函式生成隨機浮點數,在半開區間 [0.0, 1.0) 引數: size
a7 = np.random.random_sample([1, 2])
a8 = np.random.random_sample([1, 2, 3])
print("random_sample函式生成隨機浮點數:")
print(a7)
print(a8)

運行結果:

rand函式生成的均勻分布的亂數:
[[0.37825834 0.36723038]]

[[[[0.71418784 0.73996675 0.15419813 0.99419331]
   [0.58614779 0.73066644 0.49114029 0.80010252]
   [0.33072697 0.48593358 0.73750939 0.6098291 ]]

  [[0.18201681 0.34509901 0.07229337 0.89061953]
   [0.41669819 0.59503481 0.73802839 0.40802414]
   [0.185528   0.73147802 0.46253263 0.25485796]]]]
--------------------------------------------------
randn函式生成具有標準正態分布的亂數:
[[1.01330053 0.59629841]]

[[[[-1.23013022 -0.54980997 -0.86341347 -0.14536862]
   [-0.54584678 -0.22382106 -1.71041033  0.91828566]
   [-0.2115877  -0.53002694  0.04532693 -0.7821888 ]]

  [[-0.39234029 -0.82818071 -0.06566115  0.63458322]
   [ 0.51276787 -2.08087158  0.47010658  1.85817864]
   [ 1.09909745  0.24666559 -0.72258201 -0.64547011]]]]
--------------------------------------------------
randint函式生成[low, high)區間的隨機整數:
[[5 6]] int16
[[[5 2 1]
  [9 1 9]]] int32
--------------------------------------------------
random_sample函式生成隨機浮點數:
[[0.97716236 0.89218794]]

[[[0.53794987 0.11502953 0.32427659]
  [0.51851268 0.631096   0.49160983]]]

random模塊的常用亂數生成函式

函式說明
seed確定亂數生成種子
permutation回傳一個序列的隨機排列或回傳一個隨機排列的范圍
shuffle對一個序列進行隨機排序
binomial生成二項分布的亂數
normal生成正態(高斯)分布的亂數
beta生成beta分布的亂數
chisquare生成卡方分布的亂數
gamma生成gamma分布的亂數
uniform生成在[0,1]中均勻分布的亂數

通過索引訪問陣列

一維陣列的索引

# 定義陣列
a = np.arange(10)

# 獲取某個元素
print("獲取某個元素:", a[3])

# 切片(跟串列切片是一樣的)
print("取前五個元素:", a[:6], a[:-4], a[0: 6])

# 設定步長 取 1 3 5 7
print("設定步長:", a[1: 8: 2])

# 反向設定步長 取7 5 3 1
print("反向設定步長", a[7: 0: -2])

運行結果:

獲取某個元素: 3
取前五個元素: [0 1 2 3 4 5] [0 1 2 3 4 5] [0 1 2 3 4 5]
設定步長: [1 3 5 7]
反向設定步長 [7 5 3 1]

多維陣列的索引

# 定義多維陣列
a = np.array([[1,2,3,4,5], [4,5,6,7,8], [7,8,9,10,11]])

# 取第1行第2 3個 注意下標都是從0開始的 即第2行的第3 4個
print("取第1行第2 3個:", a[1, 2: 4])

# 取第0和1行 第1~4列的元素 即取第一第二行的第二個元素到最后一個元素
print("取第0和1行 第2~5列的元素:", a[:2, 1:])

# 取所有行的第3列
print("取所有行的第3列", a[:, 2])

運行結果:

取第1行第2 3: [6 7]

取第01行 第2~5列的元素: [[2 3 4 5]
 [5 6 7 8]]
 
取所有行的第3[3 6 9]

使用整數函式和布林值索引訪問多維陣列

# 定義多維陣列
a = np.array([[1,2,3,4,5], [4,5,6,7,8], [7,8,9,10,11]])

# 從兩個序列的對應位置去除兩個整數來組成下標 [0,1] [2,2] [2,3]
print("索引結果為:", a[(0,2,2), (1,2,3)])

# 取第一第二行的0,1,2列元素
print("取第一第二行的0,1,2列元素:", a[1:, (0, 1 ,2)])

# 生成一個布爾陣列
bools = np.array([0, 1, 1], dtype=np.bool)

# 取第一第二行的4列元素
print("取第一第二行的4列元素:", a[bools, 3])

運行結果:

索引結果為: [ 2  9 10]

取第一第二行的0,1,2列元素: [[4 5 6]
 [7 8 9]]
 
取第一第二行的3,4列元素: [ 7 10]

變換陣列的形態

reshape()改變陣列形狀

# 創建一個陣列
a1 = np.arange(12)
print("原資料:", a1, a1.shape)

# 改變陣列的形狀 (不改變原物件, 生成新的物件需要接識訓傳值)
a2 = a1.reshape(3, 4)
print("改變陣列的形狀:", a2, a2.shape)

運行結果:

原資料: [ 0  1  2  3  4  5  6  7  8  9 10 11] (12,)

改變陣列的形狀: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]] (3, 4)

ravel()展平陣列

# 創建一個陣列
a1 = np.arange(12)
print("原資料:", a1, a1.shape)

# 改變陣列的形狀 (不改變原物件, 生成新的物件需要接識訓傳值)
a2 = a1.reshape(3, 4)
print("改變陣列的形狀:", a2, a2.shape)

# ravel函式展平陣列 (改變原物件, 不需要接識訓傳值)
a1.ravel()
print("ravel函式展平陣列后:", a1, a1.shape)

運行結果:

原資料: [ 0  1  2  3  4  5  6  7  8  9 10 11] (12,)

改變陣列的形狀: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]] (3, 4)
 
ravel函式展平陣列: [ 0  1  2  3  4  5  6  7  8  9 10 11] (12,)

flatten()展平陣列

# 創建一個shape為(3, 4)的陣列
a1 = np.arange(12).reshape(3, 4)
print("原資料:", a, a.shape)

# flatten函式展平陣列

a2 = a1.flatten() # 橫向展平
print("橫向展平:", a2, a2.shape)

a3 = a1.flatten('F') # 縱向展平
print("縱向展平:", a3, a3.shape)

運行結果:

原資料: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]] (3, 4)
 
橫向展平: [ 0  1  2  3  4  5  6  7  8  9 10 11] (12,)

縱向展平: [ 0  4  8  1  5  9  2  6 10  3  7 11] (12,)

hstack()橫向合并陣列

# 創建兩個陣列
a1 = np.arange(12).reshape(3, 4)
a2 = a1 * 2
print("陣列1:", a1, a1.shape)
print("陣列2:", a2, a2.shape)

# hstack橫向合并
print("hstack橫向合并:", np.hstack((a1, a2)))

運行結果:

陣列1: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]] (3, 4)
 
陣列2: [[ 0  2  4  6]
 [ 8 10 12 14]
 [16 18 20 22]] (3, 4)
 
hstack橫向合并: [[ 0  1  2  3  0  2  4  6]
 [ 4  5  6  7  8 10 12 14]
 [ 8  9 10 11 16 18 20 22]]

vstack()縱向合并陣列

# 創建兩個陣列
a1 = np.arange(12).reshape(3, 4)
a2 = a1 * 2
print("陣列1:", a1, a1.shape)
print("陣列2:", a2, a2.shape)

# vstack縱向合并
print("vstack縱向合并:", np.vstack((a1, a2)))

運行結果:

陣列1: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]] (3, 4)
 
陣列2: [[ 0  2  4  6]
 [ 8 10 12 14]
 [16 18 20 22]] (3, 4)
 
vstack縱向合并: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [ 0  2  4  6]
 [ 8 10 12 14]
 [16 18 20 22]]

concatenate()合并陣列

# 創建兩個陣列
a1 = np.arange(12).reshape(3, 4)
a2 = a1 * 2
print("陣列1:", a1, a1.shape)
print("陣列2:", a2, a2.shape)

# concatenate橫向合并 (axis默認為0)
print("concatenate縱向合并:", np.concatenate((a1, a2), axis=0))

# concatenate橫向合并
print("concatenate橫向合并:", np.concatenate((a1, a2), axis=1))

運行結果:

陣列1: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]] (3, 4)
 
陣列2: [[ 0  2  4  6]
 [ 8 10 12 14]
 [16 18 20 22]] (3, 4)
 
concatenate縱向合并: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [ 0  2  4  6]
 [ 8 10 12 14]
 [16 18 20 22]]
 
concatenate橫向合并: [[ 0  1  2  3  0  2  4  6]
 [ 4  5  6  7  8 10 12 14]
 [ 8  9 10 11 16 18 20 22]]

hsplit()橫向分割陣列

# 創建一個陣列
a = np.arange(16).reshape(4, 4)
print("原陣列:", a, a.shape)

# 橫向分割
print("橫向分割:", np.hsplit(a, 2))

運行結果:

原陣列: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]] (4, 4)
 
橫向分割: [array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])]

vsplit()縱向分割陣列

# 創建一個陣列
a = np.arange(16).reshape(4, 4)
print("原陣列:", a, a.shape)

# 縱向分割
print("縱向分割:", np.vsplit(a, 2))

運行結果:

原陣列: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]] (4, 4)
 
縱向分割: [array([[0, 1, 2, 3],
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])]

split()分割陣列

# 創建一個陣列
a = np.arange(16).reshape(4, 4)
print("原陣列:", a, a.shape)

# 縱向分割 (axis默認為0)
print("縱向分割:", np.split(a, 2, axis=0))

# 橫向分割
print("橫向分割:", np.split(a, 2, axis=1))

運行結果:

原陣列: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]] (4, 4)
 
縱向分割: [array([[0, 1, 2, 3],
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])]
       
橫向分割: [array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])]

創建NumPy矩陣

矩陣創建

# mat創建矩陣 使用分號分隔資料
m1 = np.mat("1 2 3; 4 5 6; 7 8 9")
print(m1, m1.shape)

# matrix創建矩陣
m2 = np.matrix([[1,2,3], [4,5,6], [7,8,9]])
print(m2, m2.shape)

# 創建一個全為0和一個全為1的陣列
a1 = np.zeros([3, 3])
a2 = np.ones([3, 3])

# # bmat將多個小矩陣(陣列)合并成一個大矩陣
print("bmat將多個小矩陣合并成一個大矩陣:\n", np.bmat("a1 a2;a2 a1"))

運行結果:

[[1 2 3]
 [4 5 6]
 [7 8 9]] (3, 3)
 
[[1 2 3]
 [4 5 6]
 [7 8 9]] (3, 3)
 
bmat將多個小矩陣合并成一個大矩陣:
 [[0. 0. 0. 1. 1. 1.]
 [0. 0. 0. 1. 1. 1.]
 [0. 0. 0. 1. 1. 1.]
 [1. 1. 1. 0. 0. 0.]
 [1. 1. 1. 0. 0. 0.]
 [1. 1. 1. 0. 0. 0.]]

矩陣運算

# 創建兩個矩陣
m1 = np.mat("1 2 3; 4 5 6; 7 8 9")
m2 = m1 * 2
print("矩陣1:", m1, m1.shape)
print("矩陣2:", m2, m2.shape)
# 矩陣相加
print("矩陣相加:", m1 + m2)
# 矩陣相減
print("矩陣相減:", m1 - m2)
# 矩陣相除
print("矩陣相除:",  (m2+1) / (m1+1))
# 矩陣相乘
print("矩陣相乘:", m1 * m2)
print("矩陣相乘:", np.multiply(m1, m2))

運行結果:

矩陣1: [[1 2 3]
 [4 5 6]
 [7 8 9]] (3, 3)
矩陣2: [[ 2  4  6]
 [ 8 10 12]
 [14 16 18]] (3, 3)
矩陣相加: [[ 3  6  9]
 [12 15 18]
 [21 24 27]]
矩陣相減: [[-1 -2 -3]
 [-4 -5 -6]
 [-7 -8 -9]]
矩陣相除: [[1.5        1.66666667 1.75      ]
 [1.8        1.83333333 1.85714286]
 [1.875      1.88888889 1.9       ]]
矩陣相乘: [[ 60  72  84]
 [132 162 192]
 [204 252 300]]
矩陣相乘: [[  2   8  18]
 [ 32  50  72]
 [ 98 128 162]]

矩陣屬性

屬性說明
T回傳自身的轉置
H回傳自身的共軛轉置
I回傳自身的逆矩陣
A回傳自身資料的二維陣列的一個視圖(沒做任何復制)
# 創建矩陣
m = np.mat("1 2 3; 4 5 6; 7 8 9")

# 轉置
print("轉置:", m.T)

# 共軛轉置
print("共軛轉置:", m.H)

# 逆矩陣
print("逆矩陣:", m.I)

# 二維陣列的視圖
print("二維陣列的視圖:", m.A)

運行結果:

轉置: [[1 4 7]
 [2 5 8]
 [3 6 9]]
 
共軛轉置: [[1 4 7]
 [2 5 8]
 [3 6 9]]
 
逆矩陣: [[-4.50359963e+15  9.00719925e+15 -4.50359963e+15]
 [ 9.00719925e+15 -1.80143985e+16  9.00719925e+15]
 [-4.50359963e+15  9.00719925e+15 -4.50359963e+15]]
 
二維陣列的視圖: [[1 2 3]
 [4 5 6]
 [7 8 9]]

ufunc函式

常用的函式

大多數ufunc函式都是用C語言實作的,因此ufunc函式比math庫中的函式效率高,

函式使用方法
sqrt()計算序列化資料的平方根
sin()、cos()三角函式
abs()計算序列化資料的絕對值
dot()矩陣運算
log()、logl()、log2()對數函式
exp()指數函式
cumsum()、cumproduct()累計求和、求積
sum()對一個序列化資料進行求和
mean()計算均值
median()計算中位數
std()計算標準差
var()計算方差
corrcoef()計算相關系數

常用的ufunc函式運算

進行運算的兩個陣列的形狀必須相同

# 創建兩個陣列
a = np.array([1, 2, 3])
b = np.array([2, 4, 6])
# 四則運算
print("陣列相加:", a + b)
print("陣列相減:", a - b)
print("陣列相乘:", a * b)
print("陣列相除:", a / b)
print("陣列冪運算:", a ** b)

# 比較運算
print("比較結果:", a < b)
print("比較結果:", a > b)
print("比較結果:", a == b)
print("比較結果:", a <= b)
print("比較結果:", a >= b)
print("比較結果:", a != b)

運行結果:

陣列相加: [3 6 9]
陣列相減: [-1 -2 -3]
陣列相乘: [ 2  8 18]
陣列相除: [0.5 0.5 0.5]
陣列冪運算: [  1  16 729]
比較結果: [ True  True  True]
比較結果: [False False False]
比較結果: [False False False]
比較結果: [ True  True  True]
比較結果: [False False False]
比較結果: [ True  True  True]

廣播機制

  • ufunc通用函式,能夠對array中所有元素進行操作的函式
  • Broadcasting指對不同形狀的array之間執行算術運算的方式
  • 不同形狀的陣列運算時,Numpy則會執行廣播機制
  • numpy能夠運用向量化運算處理整個陣列,所以速度比較快

檔案操作

資料存盤

# 創建陣列
a = np.arange(100).reshape(10, 10)
b = a * 2

# 二進制資料保存 np.save(file, arr, allow_pickle=True, fix_imports=True)
np.save("save01", a)

# 多個陣列保存
np.savez("save02", a, b)

運行結果:
在這里插入圖片描述

檔案讀取

# 讀取單個陣列
a = np.load("save01.npy")
print("讀取單個陣列", a)

# 讀取多個陣列
data = np.load("save02.npz")
# arr_下標 固定格式
print("a:", data['arr_0'])
print("b:", data['arr_1'])

運行結果:

讀取單個陣列 [[ 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 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
 
a: [[ 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 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
 
b: [[  0   2   4   6   8  10  12  14  16  18]
 [ 20  22  24  26  28  30  32  34  36  38]
 [ 40  42  44  46  48  50  52  54  56  58]
 [ 60  62  64  66  68  70  72  74  76  78]
 [ 80  82  84  86  88  90  92  94  96  98]
 [100 102 104 106 108 110 112 114 116 118]
 [120 122 124 126 128 130 132 134 136 138]
 [140 142 144 146 148 150 152 154 156 158]
 [160 162 164 166 168 170 172 174 176 178]
 [180 182 184 186 188 190 192 194 196 198]]

txt格式保存與讀取

# 創建陣列
a = np.arange(16).reshape(4, 4)

# txt格式資料保存 np.savetxt(file, arr, fmt="%.18e", delimiter=" ", newline="\n", header="", footer="", comments="# ")
np.savetxt("save03.txt", a, fmt="%d", delimiter=",", newline="\n")

# 讀取txt檔案
data = np.loadtxt("save03.txt", delimiter=",")
print(data)

運行結果:
在這里插入圖片描述

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

genfromtxt函式讀取資料

genfromtxt函式和loadtxt函式相似,genfromtxt函式是面向結構化和缺失資料,通常使用的三個引數,fname檔案路徑,delimiter分隔符,names列標題

# 使用genfromtxt函式讀取資料
data = np.genfromtxt("save03.txt", delimiter=",")
print(data)

運行結果:

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

排序

sort函式 無回傳值 直接對原始資料修改

# 設定亂數種子
np.random.seed(11)
# 隨機生成一維陣列
a = np.random.randint(1, 10, size=10)
print("排序前:", a)
a.sort()
print("排序后:", a)

# 隨機生成二維陣列
b = np.random.randint(1, 10, size=(3, 3))

# 縱向排序
b.sort(axis=0)
print("縱向排序", b)

# 橫向排序
b.sort(axis=1)
print("橫向排序", b)

運行結果:

排序前: [1 2 8 2 8 3 9 1 1 5]

排序后: [1 1 1 2 2 3 5 8 8 9]

縱向排序 [[2 2 5]
 [3 8 6]
 [6 9 9]]
 
橫向排序 [[2 2 5]
 [3 6 8]
 [6 9 9]]

argsort函式

# 隨機生成一維陣列
a = np.random.randint(1, 10, size=10)
print("排序前:", a)
# 回傳值為重新排序后,原值的下標
print("排序后回傳下標:", a.argsort())

運行結果:

排序前: [4 2 1 4 9 8 2 5 9 3]
排序后回傳下標: [2 1 6 9 0 3 7 5 4 8]

lexsort函式

# 創建三個陣列
a = np.array([5, 7, 8, 2])
b = np.array([30, 50, 20, 80])
c = np.array([900, 400, 600, 200])

# 進行lexsort排序 只接收一個引數
d = np.lexsort((a, b , c))

# 多個鍵值排序時,按照最后一個傳入的資料排序
print("排序后回傳下標:", d)
print("排序后的陣列為:", list(zip(a[d], b[d], c[d])))

運行結果:

排序后回傳下標: [3 1 2 0]
排序后的陣列為: [(2, 80, 200), (7, 50, 400), (8, 20, 600), (5, 30, 900)]

去重與生成重復資料

# 隨機生成一維陣列
a = np.random.randint(1, 5, size=10)
print("一維陣列a:", a)

# 去重
print("去重后:", np.unique(a))

# 生成[0, 1, 2, 3, 4]
b = np.arange(5)

# np.tile(arr, times)
print("使用tile函式對b重復3次后:", np.tile(b, 3))

# 創建一個二維陣列
c = np.random.randint(0, 10, size=(2, 3))
print("二維陣列c:", c)

# np.repeat(arr, times, axis=None)
print("縱向重復資料:", np.repeat(c, 2, axis=0))
print("橫向重復資料:", np.repeat(c, 2, axis=1))

運行結果:

一維陣列a: [3 2 4 2 3 1 4 2 2 3]

去重后: [1 2 3 4]

使用tile函式對b重復3次后: [0 1 2 3 4 0 1 2 3 4 0 1 2 3 4]

二維陣列c: [[6 9 1]
 [1 6 5]]
 
縱向重復資料: [[6 9 1]
 [6 9 1]
 [1 6 5]
 [1 6 5]]
 
橫向重復資料: [[6 6 9 9 1 1]
 [1 1 6 6 5 5]]

常用的統計函式

a = np.arange(1,17).reshape(4, 4)
print("陣列a:", a)
print("求和:", np.sum(a))
print("縱向求和:", np.sum(a, axis=0))
print("橫向求和:", np.sum(a, axis=1))
print("平均值", np.mean(a))
print("縱向平均值:", np.mean(a, axis=0))
print("橫向平均值:", np.mean(a, axis=1))
print("標準差:", np.std(a))
print("方差:", np.var(a))
print("最大值:", np.max(a))
print("最小值:", np.min(a))
print("最小索引", np.argmin(a))
print("最大索引", np.argmax(a))
print("計算索引元素的累計和:", np.cumsum(a))
print("計算索引元素的累計積:", np.cumprod(a))

運行結果:

陣列a: [[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]
求和: 136
縱向求和: [28 32 36 40]
橫向求和: [10 26 42 58]
平均值 8.5
縱向平均值: [ 7.  8.  9. 10.]
橫向平均值: [ 2.5  6.5 10.5 14.5]
標準差: 4.6097722286464435
方差: 21.25
最大值: 16
最小值: 1
最小索引 0
最大索引 15
計算索引元素的累計和: [  1   3   6  10  15  21  28  36  45  55  66  78  91 105 120 136]
計算索引元素的累計積: [         1          2          6         24        120        720
       5040      40320     362880    3628800   39916800  479001600
 1932053504 1278945280 2004310016 2004189184]

恭喜你已經掌握了NumPy的精髓~
在這里插入圖片描述
碼字不易,請給博主一個小小的贊吧~

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/305462.html

標籤:python

上一篇:簡潔易懂,初學者挑戰學習Python編程30天 (四)

下一篇:火爆全網的《魷魚游戲》,今天用 Python 分析一波影評

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more