1. Single array iteration
>>> a = np.arange(6).reshape(2,3)
>>> for x in np.nditer(a):
... print x,
...
0 1 2 3 4 5
也即默認是行序優(yōu)先(row-major order,或者說是 C-order),這樣迭代遍歷的目的在于,實現和內存分布格局的一致性,以提升訪問的便捷性;
>>> for x in np.nditer(a.T):
... print x,
...
0 1 2 3 4 5
>>> for x in np.nditer(a.T.copy(order='C')):
... print x,
...
0 3 1 4 2 5
也即對 a 和 a.T 的遍歷執(zhí)行的是同意順序,也即是它們在內存中的實際存儲順序。
2. 控制遍歷順序
for x in np.nditer(a, order='F'):Fortran order,也即是列序優(yōu)先;
for x in np.nditer(a.T, order='C'):C order,也即是行序優(yōu)先;
3. 修改數組中元素的值
默認情況下,nditer將視待迭代遍歷的數組為只讀對象(read-only),為了在遍歷數組的同時,實現對數組元素值得修改,必須指定 read-write 或者 write-only的模式。
>>> a
array([[0, 1, 2],
[3, 4, 5]])
>>> for x in np.nditer(a, op_flags=['readwrite']):
... x[...] = 2 * x
...
>>> a
array([[ 0, 2, 4],
[ 6, 8, 10]])
4. 使用外部循環(huán)
將一維的最內層的循環(huán)轉移到外部循環(huán)迭代器,使得 numpy 的矢量化操作在處理更大規(guī)模數據時變得更有效率。
>>> a = np.arange(6).reshape(2,3)
>>> for x in np.nditer(a, flags=['external_loop']):
... print x,
...
[0 1 2 3 4 5]
>>>
>>> for x in np.nditer(a, flags=['external_loop'], order='F'):
... print x,
...
[0 3] [1 4] [2 5]
5. 追蹤單個索引或多重索引(multi-index)
>>> a = np.arange(6).reshape(2,3)
>>> a
array([[0, 1, 2],
[3, 4, 5]])
>>> it = np.nditer(a, flags=['f_index'])
>>> while not it.finished:
... print "%d %d>" % (it[0], it.index),
... it.iternext()
...
0 0> 1 2> 2 4> 3 1> 4 3> 5 5>
# 索引的編號,以列序優(yōu)先
>>> it = np.nditer(a, flags=['multi_index'])
>>> while not it.finished:
... print "%d %s>" % (it[0], it.multi_index),
... it.iternext()
...
0 (0, 0)> 1 (0, 1)> 2 (0, 2)> 3 (1, 0)> 4 (1, 1)> 5 (1, 2)>
補充:詳解 Numpy.ndarray
向量、矩陣 多維數組是數值計算中必不可少的工具;通過對數組數據進行批量處理,避免了對數組元素顯式地進行循環(huán)操作,這樣做的結果是可以得到簡潔、更易維護的代碼,并且可以使用更底層的庫來實現數組操作。因此,向量化計算相比按順序逐元素進行計算要快得多。
在 Python科學計算環(huán)境中,Numpy 庫提供了用于處理數組的高效數據結構,且Numpy的核心是使用C語言實現的,提供了很多處理和處理數組的函數。
NumPy支持比Python更多種類的數字類型,有5種基本數字類型:
布爾值(bool)
整數(int)
無符號整數(uint)
浮點(float)
復數(complex)
Numpy庫的核心是表示 同質的多維數據 —— 每個元素占用相同大小的內存塊, 并且所有塊都以完全相同的方式解釋。 如何解釋數組中的每個元素由單獨的數據類型對象指定, 其中一個對象與每個數組相關聯。除了基本類型(整數,浮點數 等 )之外, 數據類型對象還可以表示數據結構。
1、創(chuàng)建 Numpy 數組
NumPy提供了一個N維數組類型,即ndarray, 它描述了相同類型的“項目”集合。可以使用例如N個整數來索引項目。從數組中提取的項( 例如 ,通過索引)由Python對象表示, 其類型是在NumPy中構建的數組標量類型之一。 數組標量允許容易地操縱更復雜的數據排列。
ndarray 與 array 的區(qū)別
np.array 只是一個便捷的函數,用來創(chuàng)建一個ndarray,它本身不是一個類。
ndarray 數組,是用 np.ndarray類的對象 表示n維數組對象
所以ndarray是一個類對象,而array是一個方法。
創(chuàng)建數組有5種常規(guī)機制:
從其他Python結構(例如,列表,元組)轉換
numpy原生數組的創(chuàng)建(例如,arange、ones、zeros等)
從磁盤讀取數組,無論是標準格式還是自定義格式
通過使用字符串或緩沖區(qū)從原始字節(jié)創(chuàng)建數組
使用特殊庫函數(例如,random)
1、np.array
一個 ndarray是具有相同類型和大小的項目的(通常是固定大小的)多維容器。 尺寸和數組中的項目的數量是由它的shape定義, 它是由N個非負整數組成的tuple(元組),用于指定每個維度的大小。 數組中項目的類型由單獨的data-type object (dtype)指定, 其中一個與每個ndarray相關聯。
與Python中的其他容器對象一樣,可以通過對數組進行索引或切片(例如,使用N個整數)以及通過ndarray的方法和屬性來訪問和修改ndarray的內容。
不同的是,ndarrays可以共享相同的數據, 因此在一個ndarray中進行的更改可能在另一個中可見。 也就是說,ndarray可以是另一個ndarray 的 “view” ,它所指的數據由 “base” ndarray處理。 ndarrays也可以是Python擁有的內存strings或實現 buffer 或數組接口的對象的視圖。
通過 np.array() np.ndarray() 創(chuàng)建
# Create an array.
np.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
np.ndarray(shape, dtype=float, buffer=None, offset=0, strides=None, order=None)
一個 ndarray是具有相同類型和大小的項目的多維容器。
尺寸和數組中的項目的數量是由它的shape定義, 它是由N個非負整數組成的tuple(元組),用于指定每個維度的大小。
不同的是,ndarrays可以共享相同的數據, 因此在一個ndarray中進行的更改可能在另一個中可見。 也就是說,ndarray可以是另一個ndarray 的 “view” ,它所指的數據由 “base” ndarray處理。 ndarrays也可以是Python擁有的內存strings或實現 buffer 或數組接口的對象的視圖。
Examples:
>>> np.array([1, 2, 3])
array([1, 2, 3])
>>> np.array([1, 2, 3.0])
array([ 1., 2., 3.])
>>> np.array([[1, 2], [3, 4]])
array([[1, 2],
[3, 4]])
>>> np.array([1, 2, 3], ndmin=2)
array([[1, 2, 3]])
>>> np.array([1, 2, 3], dtype=complex)
array([ 1.+0.j, 2.+0.j, 3.+0.j])
>>> x = np.array([(1,2),(3,4)],dtype=[('a','i4'),('b','i4')])
>>> x['a']
array([1, 3])
>>> np.array(np.mat('1 2; 3 4'))
array([[1, 2],
[3, 4]])
>>> np.array(np.mat('1 2; 3 4'), subok=True)
matrix([[1, 2],
[3, 4]])
>>> np.ndarray(shape=(2,2), dtype=float, order='F')
array([[ -1.13698227e+002, 4.25087011e-303],
[ 2.88528414e-306, 3.27025015e-309]]) #random
>>> np.ndarray((2,), buffer=np.array([1,2,3]),
offset=np.int_().itemsize,
dtype=int) # offset = 1 * itemsize, i.e. skip first element
array([2, 3])
2、基本屬性
數組屬性反映了數組本身固有的信息。通常,通過其屬性訪問數組允許您獲取并有時設置數組的內部屬性,而無需創(chuàng)建新數組。公開的屬性是數組的核心部分,只有一些屬性可以有意義地重置而無需創(chuàng)建新數組。有關每個屬性的信息如下。
內存布局
以下屬性包含有關數組內存布局的信息:
方法 描 述
| ndarray.flags | 有關數組內存布局的信息。
| ndarray.shape | 數組維度的元組。
| ndarray.strides | 遍歷數組時每個維度中的字節(jié)元組。
| ndarray.ndim | 數組維數。
| ndarray.data | Python緩沖區(qū)對象指向數組的數據的開頭。
| ndarray.size | 數組中的元素數。
| ndarray.itemsize | 一個數組元素的長度,以字節(jié)為單位。
| ndarray.nbytes | 數組元素消耗的總字節(jié)數。
| ndarray.base | 如果內存來自其他對象,則為基礎對象。
數據類型
可以在dtype屬性中找到與該數組關聯的數據類型對象 :
方法 | 描 述
| ndarray.dtype | 數組元素的數據類型。
其他屬性
方法 | 描 述
| ndarray.T | 轉置數組。
| ndarray.real | 數組的真實部分。
| ndarray.imag | 數組的虛部。
| ndarray.flat | 數組上的一維迭代器。
| ndarray.ctypes | 一個簡化數組與ctypes模塊交互的對象。
3、Numpy 原生數組 創(chuàng)建 ndarray
方法 | 描 述
| eye(N[, M, k, dtype, order]) | 返回一個二維數組,對角線上有一個,其他地方為零
| identity(n[, dtype]) | 返回標識數組。
| ones(shape[, dtype, order]) | 返回給定形狀和類型的新數組,并填充為1
| ones_like(a[, dtype, order, subok, shape]) | 返回形狀與類型與給定數組相同的數組。
| zeros(shape[, dtype, order]) | 返回給定形狀和類型的新數組,并用零填充。
| zeros_like(a[, dtype, order, subok, shape]) | 返回形狀與類型與給定數組相同的零數組。
| full(shape, fill_value[, dtype, order]) | 返回給定形狀和類型的新數組,并用fill_value填充
| full_like(a, fill_value[, dtype, order, …]) | 返回形狀和類型與給定數組相同的完整數組
| empty(shape[, dtype, order]) | 返回給定形狀和類型的新數組,而無需初始化條目
| empty_like(prototype[, dtype, order, subok, …]) | 返回形狀和類型與給定數組相同的新數組
zeros_like()、ones_like()、empty_like() 等帶 _like() 的函數創(chuàng)建與參數數組的形狀及類型相同的數組。
frombuffer()、fromstring()、fromfile() 等函數可以從字節(jié)序列或文件創(chuàng)建數組
4、np.arange
| 方法 | 描 述
| arange([start,] stop[, step,][, dtype]) | 返回給定間隔內的均勻間隔的值。
| linspace(start, stop[, num, endpoint, …]) | 返回指定間隔內的等間隔數字。
| logspace(start, stop[, num, endpoint, base, …]) | 返回數以對數刻度均勻分布。
| geomspace(start, stop[, num, endpoint, …]) | 返回數字以對數刻度(幾何級數)均勻分布。
| meshgrid(*xi, **kwargs) | 從坐標向量返回坐標矩陣。
| mgridnd_grid | 實例,它返回一個密集的多維 “meshgrid”
| ogridnd_grid | 實例,它返回一個開放的多維 “meshgrid”
2、從現有的數據創(chuàng)建
方法 描 述
| array(object[, dtype, copy, order, subok, ndmin]) | 創(chuàng)建一個數組
| asarray(a[, dtype, order]) | 將輸入轉換為數組
| asanyarray(a[, dtype, order]) | 將輸入轉換為ndarray,但通過ndarray子類
| ascontiguousarray(a[, dtype]) | 返回內存中的連續(xù)數組(ndim > = 1)(C順序)
| asmatrix(data[, dtype]) | 將輸入解釋為矩陣
| copy(a[, order]) | 返回給定對象的數組副本
| frombuffer(buffer[, dtype, count, offset]) | 將緩沖區(qū)解釋為一維數組
| fromfile(file[, dtype, count, sep, offset]) | 根據文本或二進制文件中的數據構造一個數組
| fromfunction(function, shape, **kwargs) | 通過在每個坐標上執(zhí)行一個函數來構造一個數組
| fromiter(iterable, dtype[, count]) | 從可迭代對象創(chuàng)建一個新的一維數組
| fromstring(string[, dtype, count, sep]) | 從字符串中的文本數據初始化的新一維數組
| loadtxt(fname[, dtype, comments, delimiter, …]) | 從文本文件加載數據
3、創(chuàng)建矩陣
方法 | 描 述
| mat(data[, dtype]) | 將輸入解釋為矩陣
| bmat(obj[, ldict, gdict]) | 從字符串,嵌套序列或數組構建矩陣對象
| tril(m[, k]) | 數組的下三角。
| triu(m[, k]) | 數組的上三角。
| vander(x[, N, increasing]) | 生成范德蒙矩陣
| diag(v[, k]) | 提取對角線或構造對角線數組。
| diagflat(v[, k]) | 使用展平的輸入作為對角線創(chuàng)建二維數組。
| tri(N[, M, k, dtype]) | 在給定對角線處及以下且在其他位置為零的數組。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- Numpy ndarray 多維數組對象的使用
- numpy庫ndarray多維數組的維度變換方法(reshape、resize、swapaxes、flatten)
- np.newaxis 實現為 numpy.ndarray(多維數組)增加一個軸
- numpy.ndarray 交換多維數組(矩陣)的行/列方法
- NumPy實現ndarray多維數組操作