NumPy:起步 + 創建數組

NumPy:起步 + 創建數組

簡介

numpy 作為一個強化版的數組庫,提供了更強大的數組創建和操作能力,也提供了許多默認的矩陣運算,是許多其他基於 python 的包的基礎庫之一,基本上沒有什麼操作能離得開數組和矩陣。

本篇作為 numpy 開篇,將首先介紹 numpy 包裡面最重要的數組對象(ndarray)相關的屬性以及創建方法。

參考

NumPy 创建数组-菜鸟教程https://www.runoob.com/numpy/numpy-array-creation.html
Array objects-NumPy 官方文档https://numpy.org/doc/stable/reference/arrays.html

正文

Ndarray 對象

首先先要使用 NumPy 當然要先理解最重要的對象,也就是數組。在 NumPy 裡面新建了一個 Ndarray 作為 List 的強化版,接下來就先來看看 Ndarray 對象的內存結構以及各樣屬性吧。

Memory Layout 內存佈局

Ndarray(N-dimensional array) 的內存模型主要有三個部分:

  1. array 數組對象本身:一個 Ndarray 是一個由同樣大小(dtype)的連續內存塊(block)所組成的結構,多維度(dimensional)主要透過索引(index)的手段來體現
  2. data-type 數據類型:另外保存一個數據類型對象(dtype),同一個數組中所有內存塊都具有相同的大小和類型
  3. scalar 標量類型:由於 Python 內置數據類型只有整數(int)和浮點數(float)兩種,而 NumPy 提供了 24 種類似 C 的數據類型,便是透過標量(scalar)的數據類型層次了來實現。詳細原理可以查詢相關內容。

Properties 屬性

PropertyDescription
flags關於內存佈局的相關信息
shape各維度大小
strides各維度進到下一個元素的偏移量(bytes)
ndim標示著此數組的維度(dimensional),也可以說是深度
data保存著數據體的頭指針
size數組的元素總個數
itemsize數組中每個元素的大小(bytes)
nbytes數組的總大小(bytes)
base創建數組的原對象指針
  • Sample
import numpy as np

array = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(array)
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

print(array.flags)
#   C_CONTIGUOUS : True
#   F_CONTIGUOUS : False
#   OWNDATA : True
#   WRITEABLE : True
#   ALIGNED : True
#   WRITEBACKIFCOPY : False
#   UPDATEIFCOPY : False

print(array.shape)  # (3, 3)
print(array.strides)  # (24, 8)
print(array.ndim)  # 2
print(array.data)  # <memory at 0x11ee1d990>
print(array.size)  # 9
print(array.itemsize)  # 8
print(array.nbytes)  # 72
print(array.base)  # None

Data Type Objects 數據類型對象(dtype)

接下來是 NumPy 提供的類似 C 的數據類型,用於擴展 Python 的數字數據類型

Types 數據類型

  • Boolean 布爾值類型
TypeDescriptionCharacter Code
bool_Python 內置的 bool?
bool88 bits 的 bool
  • Integer 整數類型
TypeDescriptionCharacter Code
byte對應 C 的 char 類型b
short對應 C 的 short 類型h
intc對應 C 的 int 類型i
longlong對應 C 的 long long 類型q
int_Python 內置的 int 類型l
intp指針類型p
int88-bits 的 int
int1616-bits 的 int
int3232-bits 的 int
int6464-bits 的 int
ubyte無符號的 C byteB
ushort無符號的 C shortH
uintc無符號的 C intI
ulonglong無符號的 C long longQ
uint無符號的 Python intL
uintp無符號的 intpP
uint8無符號的 int8
uint16無符號的 int16
uint32無符號的 int32
uint64無符號的 int64
  • Floating-point 浮點數類型
TypeDescriptionCharacter Code
half一半大小的 float ?e
single對應 C 的 floatf
double對應 C 的 double
longfloat對應 C 的 long floatg
float_Python 內置的 floatd
float1616-bits 的 float
float3232-bits 的 float
float6464-bits 的 float
float9696-bits 的 float
float128128-bits 的 float
  • Complex 複數類型
TypeDescriptionCharacter Code
csingleF
complex_Python 內置的 complexD
clongfloat對應 C 的 long floatG
complex64兩個 32-bits 的 float 組成
complex128兩個 64-bits 的 float 組成
complex192兩個 96-bits 的 float 組成
complex256兩個 128-bits 的 float 組成
  • 其他類型
TypeDescriptionCharacter Code
bytes_Python 內置的 bytesS#
unicode_Python 內置的 unicode/strU#
void空類型V#

np.dtypes 創建數據類型對象

接下來我們就能夠創建數據類型對象(dtype)了,其實上面列了很多,常用的也那就那幾個:

  • 使用標量(scalar)類型
dt = np.dtype(np.int32)  # int32 類型
dt = np.dtype(np.complex128)  # complex128 類型
# 就是直接 np.xxx 就對了
# 默認為 float_
  • 使用內置類型
dt = np.dtype(int)  # 內置 int 類型
dt = np.dtype(float)  # 內置 float 類型
dt = np.dtype(object)  # 內置對象類型
# 默認為 float 類型
  • 使用字符標示(上面提到的 Character Code)
dt = np.dtype('?')  # 內置 bool 類型
dt = np.dtype('i')  # 內置 int 類型
dt = np.dtype('f')  # 內置 float 類型

dt = np.dtype('i4')  # 32-bits int 類型
dt = np.dtype('f8')  # 64-bits float 類型
dt = np.dtype('c16')  # 128-bits complex 類型
dt = np.dtype('a25')  # 25 個字符的 C 字符串('\0' 結尾)
dt = np.dtype('U25')  # 25 個字符的 str
  • 聯合類型
dt = np.dtype("i4, (2,3)f8, f4")
dt = np.dtype("a3, 3u8, (3,4)a10")

內置類型符號表

這邊提供一個內置類型的符號表快速索引,供參考:

CharaterType
b布爾類型
i有符號整數
u無符號整數
f浮點數
c複數(由兩個浮點數組成)
O對象類型
mtimedelta 時間間隔
Mdatetime 日期時間
S, a字符串類型(byte- 字節流,\0 結尾)
U字符串類型(Unicode)
V空類型

Create 創建數組

介紹了這麼多前置條件,現在就要進入重頭戲:創建數組了。首先我們先羅列接下來要介紹的創建數組的方法(這不是全部,僅挑常用的,剩下的可以自己再查相關文檔):

TypeFunctionDescription
初始化數組np.empty創建新數組,內容為隨機值(未初始化)
np.zeros創建新數組,以 0 填充
np.ones創建新數組,以 1 填充
從已有資源創建np.array以傳入數組創建新數組
np.asarray同上,可選參數較少
np.frombuffer數據流(buffer)創建數組
np.fromiter可迭代對象(iterable)創建數組
指定數值範圍np.arange創建指定數值範圍的數組,參數與 range() 方法類似
np.linspace創建等差數列
np.logspace創建等比數列

初始化數組

這邊的創建對象方法就是指定(或不指定)單一值用來開闢一個空間而已。

語法

語法中傳入的參數表示默認值

# 空數組(未初始化)
numpy.empty(shape, dtype = float, order = 'C')
# 0 數組
numpy.zeros(shape, dtype = float, order = 'C')
# 1 數組
numpy.ones(shape, dtype = float, order = 'C')
  • 參數說明
ParamDescription
shape表示各維度大小的元組(tuple)
dtype表示數組的數據類型
order表示數據在內存模型的排列方式
Sample
a = np.empty((2,4))
print(a)
# [[1.68653148e-051 7.16572198e-038 2.46580783e+184 1.25758944e-047]
#  [4.42905954e+175 4.65851170e-033 1.17633826e-047 0.00000000e+000]]

a = np.zeros((3,2), dtype=np.int8)
print(a)
# [[0 0]
#  [0 0]
#  [0 0]]

a = np.ones((3,3), dtype=np.complex)
print(a)
# [[1.+0.j 1.+0.j 1.+0.j]
#  [1.+0.j 1.+0.j 1.+0.j]
#  [1.+0.j 1.+0.j 1.+0.j]]

從已有資源創建 Ndarray

所謂的已有資源通常有三種:

  1. List 列表類型,也就是內置數組,如 [1,2,3]
  2. 流(buffer)類型,如 b'http://google.com'
  3. 可迭代對象(iterable)類型,如 iter()
語法
# 數組方法一
numpy.array(object, dtype = float, copy = True, order = 'C', subok = True, ndmin = 0)
# 數組方法二
numpy.asarray(a, dtype = None, order = None)
# 從`流(buffer)`建立數組
numpy.frombuffer(buffer, dtype = None, count = -1, offset = 0)
# 從`可迭代對象`建立數組
numpy.fromiter(iterable, dtype, count=-1)
  • 參數說明
ParamDescription
object, a列表(List)元組(Tuple)任意組合嵌套的數列
dtype數據類型對象
copy是否需要複製對象
order內存模型中排列方式
subokFalse 時所有元素都必須是嚴格的 array 而不能是聯合類型
ndim生成數組的最小維度數
buffer以流的形式讀取對象
count讀取的數據量,默認 -1 為全部
offset讀取起始位置,默認 0 為開頭
iterable可迭代對象
Sample
array = np.array([1,2,3,4,5], dtype = np.complex)
print(array)
# [1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j]

array = np.array([1,2,3], ndmin = 2)
print(array)
# [[1 2 3]]

array = np.asarray([(1,2),(3,4,5)])
print(array)
# [(1, 2) (3, 4, 5)]

array = np.frombuffer(b'Hello World', dtype='S1', count=5)
print(array)
# [b'H' b'e' b'l' b'l' b'o']

array = np.fromiter(iter(range(5)), dtype=float)
print(array)
# [0. 1. 2. 3. 4.]

指定數值範圍

最後一種是指定數值範圍,就好像在 for 循環使用 range 建立的迭代序列一樣

語法
# 指定範圍,stop 不包含
numpy.arange(start, stop, step=1, dtype)
# 等差數列
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
# 等比數列
numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
  • 參數說明
ParamDescription
start起始值
stop終止值(arange 默認不包含,linspace 和 logspace 默認包含)
step步長(默認 1) or 等差值() or 等比值()
num生成樣本數量,默認 50
endpoint默認 True,表示是否包含 stop 值
retstep默認 False,打印時顯示步長
Sample
a = np.arange(1, 10)
print(a)
# [1 2 3 4 5 6 7 8 9]

a = np.linspace(0, 10, endpoint=False, retstep = True)
print(a)
# (array([0. , 0.2, 0.4, 0.6, 0.8,
#         1. , 1.2, 1.4, 1.6, 1.8,
#         2. , 2.2, 2.4, 2.6, 2.8,
#         3. , 3.2, 3.4, 3.6, 3.8,
#         4. , 4.2, 4.4, 4.6, 4.8,
#         5. , 5.2, 5.4, 5.6, 5.8,
#         6. , 6.2, 6.4, 6.6, 6.8,
#         7. , 7.2, 7.4, 7.6, 7.8,
#         8. , 8.2, 8.4, 8.6, 8.8,
#         9. , 9.2, 9.4, 9.6, 9.8]), 0.2)

a = np.logspace(0, 10, num=11, base=2, dtype=np.int32)
print(a)
# [   1    2    4    8   16   32   64  128  256  512 1024]

結語

本篇簡單介紹了 numpy 提供的數據類型,以及 ndarray 多維數組對象的三種共十個創建對象的方法。後續我們將會來介紹 numpy 中提供的數組訪問、矩陣操作、高級索引、切片等操作,敬請期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值