numpy數組用法


一、Numpy數組基本用法

1、NumpyPython科學計算庫,用於快速處理任意維度的數組。

2、NumPy提供一個N維數組類型ndarray,它描述了相同類型的“items”的集合。

3、numpy.ndarray支持向量化運算。

4、NumPy使用c語言寫的,底部解除了GIL,其對數組的操作速度不在受python解釋器限制。

二、numpy中的數組:

Numpy中的數組的使用跟Python中的列表非常類似。他們之間的區別如下:

1、一個列表中可以存儲多種數據類型。比如a = [1,'a']是允許的,而數組只能存儲同種數據類型。

2、數組可以是多維的,當多維數組中所有的數據都是數值類型的時候,相當於線性代數中的矩陣,是可以進行相互間的運算的。

三、創建數組(np.ndarray對象):

Numpy經常和數組打交道,因此首先第一步是要學會創建數組。在Numpy中的數組的數據類型叫做ndarray。以下是兩種創建的方式:

1、根據Python中的列表生成:

import numpy as np
a1 = np.array([1,2,3,4])
print(a1)
print(type(a1))

2、使用np.arange生成,np.arange的用法類似於Python中的range

import numpy as np
a2 = np.arange(2,21,2)
print(a2)

3、使用np.random生成隨機數的數組:

a1 = np.random.random(2,2) # 生成2行2列的隨機數的數組
a2 = np.random.randint(0,10,size=(3,3)) # 元素是從0-10之間隨機的3行3列的數組

4、使用函數生成特殊的數組:

import numpy as np
a1 = np.zeros((2,2)) #生成一個所有元素都是0的2行2列的數組
a2 = np.ones((3,2)) #生成一個所有元素都是1的3行2列的數組
a3 = np.full((2,2),8) #生成一個所有元素都是8的2行2列的數組
a4 = np.eye(3) #生成一個在斜方形上元素為1,其他元素都為0的3x3的矩陣

四、ndarray常用屬性:

ndarray.dtype

因為數組中只能存儲同一種數據類型,因此可以通過dtype獲取數組中的元素的數據類型。以下是ndarray.dtype的常用的數據類型:

數據類型 描述 唯一標識符
bool 用一個字節存儲的布爾類型(True或False) 'b'
int8 一個字節大小,-128 至 127 'i1'
int16 整數,16 位整數(-32768 ~ 32767) 'i2'
int32 整數,32 位整數(-2147483648 ~ 2147483647) 'i4'
int64 整數,64 位整數(-9223372036854775808 ~ 9223372036854775807) 'i8'
uint8 無符號整數,0 至 255 'u1'
uint16 無符號整數,0 至 65535 'u2'
uint32 無符號整數,0 至 2 ** 32 - 1 'u4'
uint64 無符號整數,0 至 2 ** 64 - 1 'u8'
float16 半精度浮點數:16位,正負號1位,指數5位,精度10位 'f2'
float32 單精度浮點數:32位,正負號1位,指數8位,精度23位 'f4'
float64 雙精度浮點數:64位,正負號1位,指數11位,精度52位 'f8'
complex64 復數,分別用兩個32位浮點數表示實部和虛部 'c8'
complex128 復數,分別用兩個64位浮點數表示實部和虛部 'c16'
object_ python對象 'O'
string_ 字符串 'S'
unicode_ unicode類型 'U'

我們可以看到,Numpy中關於數值的類型比Python內置的多得多,這是因為Numpy為了能高效處理處理海量數據而設計的。舉個例子,比如現在想要存儲上百億的數字,並且這些數字都不超過254(一個字節內),我們就可以將dtype設置為int8,這樣就比默認使用int64更能節省內存空間了。類型相關的操作如下:

1、默認的數據類型:

import numpy as np
a1 = np.array([1,2,3])
print(a1.dtype) 
# 如果是windows系統,默認是int32
# 如果是mac或者linux系統,則根據系統來

2、指定

dtype:
import numpy as np
a1 = np.array([1,2,3],dtype=np.int64)
# 或者 a1 = np.array([1,2,3],dtype="i8")
print(a1.dtype)

3、修改

dtype:
import numpy as np
a1 = np.array([1,2,3])
print(a1.dtype) # window系統下默認是int32
# 以下修改dtype
a2 = a1.astype(np.int64) # astype不會修改數組本身,而是會將修改后的結果返回
print(a2.dtype)

ndarray.size

獲取數組中總的元素的個數。比如有個二維數組:

   import numpy as np
   a1 = np.array([[1,2,3],[4,5,6]])
   print(a1.size) #打印的是6,因為總共有6個元素

ndarray.ndim

數組的維數。比如:

   a1 = np.array([1,2,3])
   print(a1.ndim) # 維度為1
   a2 = np.array([[1,2,3],[4,5,6]])
   print(a2.ndim) # 維度為2
   a3 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
   print(a3.ndim) # 維度為3

ndarray.shape

數組的維度的元組。比如以下代碼:

   a1 = np.array([1,2,3])
   print(a1.shape) # 輸出(3,),意思是一維數組,有3個數據

   a2 = np.array([[1,2,3],[4,5,6]])
   print(a2.shape) # 輸出(2,3),意思是二位數組,2行3列

   a3 = np.array([
       [
           [1,2,3],
           [4,5,6]
       ],
       [
           [7,8,9],
           [10,11,12]
       ]
   ])
   print(a3.shape) # 輸出(2,2,3),意思是三維數組,總共有2個元素,每個元素是2行3列的

   a44 = np.array([1,2,3],[4,5])
   print(a4.shape) # 輸出(2,),意思是a4是一個一維數組,總共有2列
   print(a4) # 輸出[list([1, 2, 3]) list([4, 5])],其中最外面層是數組,里面是Python列表

另外,我們還可以通過ndarray.reshape來重新修改數組的維數。示例代碼如下:

   a1 = np.arange(12) #生成一個有12個數據的一維數組
   print(a1) 

   a2 = a1.reshape((3,4)) #變成一個2維數組,是3行4列的
   print(a2)

   a3 = a1.reshape((2,3,2)) #變成一個3維數組,總共有2塊,每一塊是2行2列的
   print(a3)

   a4 = a2.reshape((12,)) # 將a2的二維數組重新變成一個12列的1維數組
   print(a4)

   a5 = a2.flatten() # 不管a2是幾維數組,都將他變成一個一維數組
   print(a5)

注意,reshape並不會修改原來數組本身,而是會將修改后的結果返回。如果想要直接修改數組本身,那么可以使用resize來替代reshape

ndarray.itemsize

數組中每個元素占的大小,單位是字節。比如以下代碼:

   a1 = np.array([1,2,3],dtype=np.int32)
   print(a1.itemsize) # 打印4,因為每個字節是8位,32位/8=4個字節

jupyter:

image
image

總結:
1、數組一般達到3維就已經很復雜了,不太方便計算了,所以我們一般都會把3維以上的數組轉換成2維數組來計算
2、通過ndarray.ndim可以看到數組的維度
3、通過ndarray.shape可以看到數組的形狀(幾行幾列),shape是一個元組,里面又幾個元素代表是幾維數組
4、通過ndarray.reshape可以修改數組的形狀。條件只有一個,就是修改后的形狀的元素個數必須和原來一致。
reshape不會修改原來數組的形狀,只會將修改完的結果返回
5、通過ndarray.size可以看到數組有多少個元素。
6、通過ndarray.itemsize可以看到數組中的每個元素所占內存的大小,單位是字節(一個字節 = 8個單位)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM