python科學計算_numpy_ndarray

ndarray:n-dimensional array object,即多維數組對象,是python自帶的array對象的擴展,array對象和list對象的區別是array對象的每個元素都是數值,而list保存的是每一個元素對象的指針,而做爲array對象的擴展,ndarray在科學計算中就很是適合而且功能強大。python

建立ndarray

1. 使用列表對象建立ndarray數組

import bumpy as np
a = np.array([1,2,3,4])ide

以上爲一種建立ndarray的方式,即用一個列表對象來建立,注意,ndarray中的全部元素類型都必須一致(atomic vector),上例中,若是其中一個元素爲字符類型,則全部的元素都會自動轉換爲字符類型,經過dtype屬性來獲取ndarray中每一個元素的類型,同時numpy中還提供了numpy.typeDict來存放各類類型的簡稱-類型字典;函數

因爲ndarray是多維數組對象,能夠經過shape屬性來獲取數組的各維狀況,而且能夠經過reshape方法改變當前的形狀;atom

NewImage

 

2. 使用numpy中特有函數建立ndarrayspa

除了使用python中的列表對象來建立ndarray以外,numpy中還提供了一系列特定的函數用來建立ndarray3d

numpy.arange(0,1,0.1):arange和range相似,經過指定起始值、終止值、步長來建立數組,是一個前閉後開的區間,如該例建立的數組爲:array([0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]);指針

numpy.linspace(0,1,10):linspace是經過指定起始值、終止值、元素個數來建立一個等差數組,默認爲前閉後閉,經過設置endpoint=False能夠對終止值設置是否包含;對象

numpy.logspace(0,1,12,base=2,endpoint=False):logspace是和linspace的區別是建立的是等比數組,默認以10爲底,經過設置base改變底值;blog

numpy.zeros()、numpy.ones()、numpy.empty()等函數建立特定形狀的數組,和matlab中相似;

numpy.fromstring():經過字符串來建立數組,字符串的每個字符佔用一個字節的空間,也就是8個字節,經過指定dtype,建立不一樣的數組;當dtype=int8時,每一個字符對應一個元素,當dtype=16時,兩個字符對應一個元素,而且以16進制保存(高位的字符須要乘以16);

numpy.fromfunction(func, (10,)):該函數經過指定一個建立函數和一個shape來建立數組,當shape只有一個元素(一維數組)時,func函數應該也只有一個參數,而且該參數自動從0開始遞增帶入獲得一系列返回值,從而建立ndarray;

NewImage
NewImage

存取ndarray

1. 存取一維ndarray

ndarray的元素訪問支持python中的列表的訪問方式(下標以及切片)訪問ndarray元素,經過下標和切片訪問獲得的新數組是原始數組的一個視圖(view),和原始數組共享存儲;

除了列表的訪問方式,ndarray還支持整數列表、整數數組、布爾數組等訪問方式,經過這些訪問方式獲得的新數組是原始數組的拷貝,並不共享存儲;

整數列表的訪問會按照給定列表的元素做爲下標依次訪問原始數組中的每一個元素:

a = np.arange(10)
b = a[[3,3,-3,8]]

整數數組的訪問在列表的基礎上,訪問獲得的新數組會保留數組的形狀;

布爾數組的訪問,指使用一個布爾數組,只訪問到布爾數組中True對應下標的元素;注意,只對布爾數組有效,若是是列表,則會講True和False當作1和0做爲下標處理;

布爾數組的訪問一般由ufunc產生;

NewImage

 2. 存取多維數組

訪問多維數組須要指定多維的下標,在python中實現多維下標的方式是經過元組(tuple),因爲 1,2 和 (1,2)表示的語義相同,因此用元組表示下標時,也變得很是天然;ndarray的多維數組中,能夠經過元組中分別指定切片來訪問多維數組(獲得的仍然是視圖);同時也能夠經過數組和切片的組合、數組和數組的組合來訪問多維數組,記住將元組做爲下標,元組中的每一個元素分別對應某一維上的下標,則一切迎刃而解;

須要注意的是,使用切片是指定某一行或者某一列等(保留形狀),可是用整數數組訪問時,訪問的是某一個下標(不會保留形狀,只是簡單地將值取出);

若是一個多維數組訪問時,指定的下標小於維數,則剩餘的維數下標默認所有訪問(至關於切片 : 代替);

若是用數組和數組的結合來訪問多維數組,則只有當兩個數組的形狀相同時,獲得的數組和下標數組的形狀相同;

numpy中可使用一個列數組和一個行數組相加獲得一個二維數組;

NewImage
NewImage

結構數組

經過使用結構數組,能夠實現相似C語言中struct的功能;結構數組使用numpy.dtype()實例,實例化時,使用一個字典指定結構的名稱和對應的類型(類型可使用numpy.typeDict中的簡稱,字符串經過S32等來表示,32指定保存時的字符串長度,用之內存對齊);

結構數組除了數組用下標的訪問方式以外,還能夠經過字段訪問;

經過numpy定義的結構數組能夠經過tofile方法直接保存到文件中,而且該文件能夠被c語言獲取結構;

NewImage

a.tofile(’test.bin')

經過c語言讀取:

#include <stdio.h>
struct person
{
    char name[32];
    int age;
    float weight;

struct person p[3];
void main(){
    FILE *fp;
    int i;
    fp = fopen("test.bin","rb");
    fread(p, sizeof(struct person), 2, fp);
    fclose(fp);
    for(i=0; i<2; i++){
       printf("%s %d %f\n",p[i].name, p[i].age, p[i].weight);
    }

內存結構

adarray的信息使用一個數組來描述,該數組引用兩個對象:dtype和data,其中data表示一個連續的數據存儲區域,並保存數組的形狀以及間隔,從而訪問連續存儲區域中的指定位置存放的數據,實現對數組的訪問;

NewImage

如上圖,dtype指向元素類型的對象;

dim count表示維數,dimensions是一個長度爲dim count的數組,指定數組每一維的長度;

strides是一個長度爲dim count的數組,每一個元素是一個整數值,用來指定各維元素的間隔,如上圖中表示第一維元素每增長1,則地址增長12,第二維元素每增長1,則地址增長4;

numpy中默認的數據存儲排序方式是c語言中的排序方式,即第一維是最上位的,第一維的值增長1時,地址增長的範圍最大,而在fortran語言中,第一維是最下位的,第一維增長1時,只增長一個元素的字節長度,如上例中,strides若是按照fortran語言中的排序方式,則應該爲:(4,12),經過在定義數組時,指定order=「F」,來使用fortran語言的排序方式;

瞭解內存結構能夠解釋如下問題:爲何切片訪問數組時,獲得的數組是視圖,而經過數組訪問數組時,獲得的數組是一份拷貝?

因爲切片訪問數組時,只須要改變strides的值,就能夠對數組進行另一種方式的訪問,如若是存在數組a按照上圖的方式保存,則b = [::2,::2]獲得一個新的數組時,只須要將strides改成(24,8)就能夠,而data則能夠引用相同的存儲區域;而當使用數組進行訪問時,因爲並不能保證是等間隔分佈的,沒法經過改變其餘屬性的方式保持數據不變,因此只能新建一份數據的拷貝來實現;

經過數組的flags屬性能夠查看數據存儲區域的屬性;

相關文章
相關標籤/搜索