numpy之初識ndarray


Numpy

ndarray

numpy的最重要特點就是其N維數組對象(ndarray)。

ndarray的可以對整塊數據執行數學運算,語法與標量元素的元素的運算一致。
如:

import numpy as np
x = array([[-0.50043612, -1.99790499,  0.66098891,  0.26490388],
       [-1.02531769,  0.50054972, -1.30755871,  1.53881345]])
x + x #相加
Out[10]: 
array([[-1.00087224, -3.99580998,  1.32197782,  0.52980775],
       [-2.05063538,  1.00109944, -2.61511741,  3.0776269 ]])

x * 10 #乘以標量
Out[11]: 
array([[ -5.0043612 , -19.97904992,   6.60988909,   2.64903877],
       [-10.25317691,   5.00549718, -13.07558707,  15.38813451]])

1 / x #1/x被除
Out[5]: 
array([[-1.99825704, -0.5005243 ,  1.51288469,  3.77495415],
       [-0.97530747,  1.99780353, -0.76478401,  0.64985135]])

x - x #相減
Out[12]: 
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
  • shape查詢數組維度
  • ndim數組的維數
  • dtype查詢數組數據類型
x.shape
Out[13]: (2, 4) # 2行4列

x.ndim
Out[15]: 2 # 2維

x.dtype
Out[14]: dtype('float64') #數據類型

創建ndarray

1. array函數

將輸入數據(列表,元組,數組,或其他),轉換為ndarray

y = list(range(1,11)) #如果直接輸入y = range(1,11),會返回一個迭代器。
y
Out[33]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

arr1 = np.array(y)
arr1
Out[35]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

z = [[1, 2, 3, 4],[5, 6, 7, 8]]# 生成一個嵌套序列(一組等長列表組成的列表)
arr2 = np.array(z)
arr2
Out[44]: 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

2. asarray函數

將輸入轉換為ndarray,若本身是ndarray則不復制。

3. arange函數

arange()是python內置函數range()的數組版。
arange()生成一個一維數組,range生成列表。

np.arange(11) #可對比上文的range理解。
Out[45]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

4. ones,ones_like函數

這里必須說明一下,如果ndarray沒有指定數據類型,則默認為float64(浮點數)。

ones根據指定的形狀和dtype創建一個全1數組。
ones_like以另一個數組為參數,並根據其形狀和dtype創建一個全1數組。

np.ones(2) #默認一維
Out[46]: array([ 1.,  1.])

np.ones((2,3))
Out[47]: 
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

np.ones(3,dtype = np.int32) # 指定數據類型
Out[51]: array([1, 1, 1])

np.ones_like(arr2) #以arr2為參數
Out[54]: 
array([[1, 1, 1, 1],
       [1, 1, 1, 1]])

5. zeros,zeros_like函數

類似與onesones_like,但是創建的是全0數組。

6. empty,empty_like函數

創建新數組,分配內存空間,但不填充任何值。


np.empty(2)
Out[56]: array([ 0.,  0.])

np.empty((2,4)) #2 * 4
Out[57]: 
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

np.empty_like(arr2) #以arr2為參數
Out[60]: 
array([[0, 0, 0, 0],
       [0, 0, 0, 0]])

看到這里你是不是以為np.empty會返回全0數組?

其實不是的。

np.empty((3,3,2)) # 3維數組
Out[58]: 
array([[[  6.23042070e-307,   4.67296746e-307],
        [  1.69121096e-306,   1.33512376e-306],
        [  1.33511562e-306,   1.11256817e-306]],

       [[  1.06811422e-306,   1.42417221e-306],
        [  1.11260619e-306,   8.90094053e-307],
        [  1.86919378e-306,   1.06809792e-306]],

       [[  1.37962456e-306,   1.69111861e-306],
        [  1.78020169e-306,   1.37961777e-306],
        [  7.56599807e-307,   2.56761491e-312]]])

7. eye,identity函數

返回一個N介單位矩陣。

np.eye(5) # 創建5介單位陣
Out[61]: 
array([[ 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.]])

np.identity(5) #創建5介單位陣
Out[63]: 
array([[ 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.]])

eye(N, M = None, k = 0,dtype =float)

第一個參數N = 行數。
第二個參數 M = 列數,省略代表M = N 。
第三個參數 k 代表對角線位置, = 0 代表主對角線, +1就向右上方偏移1, -1 就向左下角偏移1。
第四個參數表示類型 dtype 默認為 float 類型。

np.eye(4,k = 1) #向上偏移
Out[69]: 
array([[ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.]])

np.eye(4,k = -1) #向下偏移
Out[70]: 
array([[ 0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.]])

np.eye(4,8) #給定M
Out[67]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.]])

ndarray的數據類型

numpy所支持的數據類型如下:

數據類型 描述
bool_ 以字節存儲的布爾值(True 或 False)
int_ 默認的整數類型(和 C 的 long 一樣,是 int64 或者 int32)
intc 和 C 的 int 相同(一般為 int64 或 int32)
intp 用於下標的整數(和 C 的 ssize_t 相同,一般為int64 或者 int32)
int8 字節(-128 到 127)
int16 整數(-32768 到 32767)
int32 整數(-2147483648 到 2147483647)
int64 整數(-9223372036854775808 到 9223372036854775807)
uint8 無符號整數(0 到 255)
uint16 無符號整數(0 到 65535)
uint32 無符號整數(0 到 4294967295)
uint64 無符號整數(0 到 18446744073709551615)
float_ float64 的簡寫
float16 半精度浮點:1位符號,5位指數,10位尾數
float32 單精度浮點:1位符號,8位指數,23位尾數
float64 雙精度浮點:1位符號,11位指數,52位尾數
complex_ complex128 的簡寫
complex64 由兩個32位浮點(實部和虛部)組成的復數
complex128 由兩個64位浮點(實部和虛部)組成的復數
string_ 固定長度的字符創類型(每個字符一個字節)

很難記住這些numpy的dtype。我們只需要控制存儲類型即可。

arr1 = np.array([1, 2, 3],np.int32)
arr2 = np.array([2,3,4],dtype = np.float64)

arr1.dtype
Out[14]: dtype('int32')
arr2.dtype
Out[11]: dtype('float64')

.astype()方法可以顯式的轉換為dtype。


float_arr1 = arr1.astype(np.float64) #整型轉換為浮點型

float_arr1.dtype 
Out[16]: dtype('float64')

float_arr1
Out[17]: array([ 1.,  2.,  3.])

浮點型轉換為整型,只保留整數部分。

arr3 = np.array([2.3, -1.32, -5.9, 4.8])

arr3
Out[25]: array([ 2.3 , -1.32, -5.9 ,  4.8 ])

arr3.astype(np.int32)#轉換為整數
Out[26]: array([ 2, -1, -5,  4]) #可看到小數部分被丟棄了

有時某個字符串不能被轉換為float64,就會引發TypeError,因此,我們可以懶一點,
像下面這樣寫:


n_strings = np.array(['1.23','-9.6','23'],dtype = np.string_)

n_strings.astype(np.float)
Out[32]: array([  1.25656565,  -9.6       ,  23.        ])

n_strings.astype(np.float64)
Out[30]: array([  1.25656565,  -9.6       ,  23.        ])

n_strings
Out[35]: 
array([b'1.256565653', b'-9.6', b'23'], 
      dtype='|S11')

可以看到這兩種結果一致。

numpy會將其數據類型映射到等價的dtype上。
可以發現,使用.astype()新創建了一個數組(原數組的一種拷貝),即使,與原來數據類型一致也會如此。


免責聲明!

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



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