この記事では、主に NumPy を詳しく理解するための簡潔なチュートリアルを紹介します (2. 配列 1)。 NumPy 配列は多次元配列オブジェクトであり、興味のある友人は参照してください。
私の現在の仕事は、Pyston (Dropbox によって実装された Python コンパイラー/インタープリター) に NumPy を導入することです。作業プロセス中、私は NumPy のソース コードに詳しく触れ、その実装を理解し、NumPy のバグを修正するための PR を提出しました。 NumPy ソース コードと NumPy 開発者を扱う過程で、現在の中国語の NumPy チュートリアルのほとんどが英語のドキュメントを翻訳または参照しているため、多くの省略が生じていることがわかりました。たとえば、NumPy 配列のブロードキャスト関数は、ほぼすべての中国語ドキュメントで「ブロードキャスト」と翻訳されます。 NumPy の開発者の 1 人は、「ブロードキャストは複合語です。英語を母国語とする人は、これが「ブロード」+「キャスト」=「広くキャスト (分散、配布) であると理解できます。おそらく、「ブロードキャスト (分散、配布)」だと思います。これを考慮して、NumPy の使用法とソース コード
NumPy 配列
NumPy 配列は、ndarray と呼ばれる多次元配列オブジェクトであり、次の 2 つの部分で構成されます:
実際のデータ
これらのデータを説明するメタデータ
ほとんどの操作はメタデータのみに使用され、基になる実際のデータデータは変更されません。
NumPy 配列について知っておくべきことがいくつかあります:
NumPy 配列の添字は 0 から始まります。
同じ NumPy 配列内のすべての要素の型は、同じです。
NumPy 配列を詳しく紹介する前に、まず NumPy 配列の基本的なプロパティを詳しく紹介しましょう。 1 次元配列の次元は 1、2 次元配列のランクは 2 などとなります。NumPy では、各線形配列は軸 (axes) と呼ばれ、実際にはランクは次の数を表します。たとえば、2 次元配列は 2 つの 1 次元配列と同等であり、最初の 1 次元配列の各要素は別の 1 次元配列であるため、NumPy では 1 次元配列が軸 (axes) になります。 、最初の軸は基になる配列に相当し、2 番目の軸は基になる配列内の配列に相当し、より重要な ndarray オブジェクトの次元になります。 NumPy のプロパティは次のとおりです:
ndarray.ndim: 配列の次元 (つまり、配列の軸の数) はランクに等しいです。最も一般的なのは 2 次元配列 (行列) です。 .shape: 配列の次元は、各次元の配列のサイズを表す整数タプルであり、次元配列では、配列の「行数」と「列数」を表します。タプル、このタプルの長さは ndim 属性です。合計数は
のタプル要素の積に等しくなります。 ndarray.dtype: 配列内の要素の型を表すオブジェクト。dtype を作成または指定するには、NumPy が提供するデータ型の紹介でも使用できます。 。
ndarray.itemsize: 配列内の各要素のバイト サイズ。たとえば、要素タイプが float64 である配列の itemsiz 属性値は 8 です (float64 は 64 ビットを占有し、各バイトの長さは 8 であるため、64/8 で 8 バイトを占有します)。別の例は、要素タイプが次の配列です。 complex32。配列項目の属性は 4 (32/8) です。
ndarray.data: 実際の配列要素を含むバッファ。要素は通常、配列のインデックスを通じて取得されるため、通常はこの属性を使用する必要はありません。
>>> from numpy import * >>> a = array( [2,3,4] ) >>> a array([2, 3, 4]) >>> a.dtype dtype('int32') >>> b = array([1.2, 3.5, 5.1]) >>> b.dtype dtype('float64')
配列関数を使用して作成する場合、パラメータは角括弧で囲まれたリストである必要があり、複数の値をパラメータとして配列を呼び出すことはできません。
>>> a = array(1,2,3,4) # 错误 >>> a = array([1,2,3,4]) # 正确
ダブル シーケンスを使用して 2 次元配列を表現したり、トリプル シーケンスを使用して 3 次元配列を表現したりすることができます。
>>> b = array( [ (1.5,2,3), (4,5,6) ] ) >>> b array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]])
作成時に配列内の要素の型を明示的に指定できます
>>> c = array( [ [1,2], [3,4] ], dtype=complex) >>> c array([[ 1.+0.j, 2.+0.j], [ 3.+0.j, 4.+0.j]])
通常、配列の要素は最初は不明で、配列のサイズはわかっています。したがって、NumPy は、プレースホルダーを使用して配列を作成するための関数をいくつか提供します。これらの関数は、高い計算オーバーヘッドを削減しながら、配列拡張のニーズを満たすのに役立ちます。
すべて 0 の配列を作成するには関数 zeros を使用し、すべて 1 の配列を作成するには関数 one を使用し、ランダムな内容でメモリ状態に依存する配列を作成するには関数 empty を使用します。デフォルトで作成される配列型 (dtype) は float64 です。 d.dtype.itemsize を使用して、配列内の要素が占めるバイト数を確認できます。>>> d = zeros((3,4)) >>> d.dtype dtype('float64') >>> d array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) >>> d.dtype.itemsize 8
>>> ones( (2,3,4), dtype=int16 ) #手动指定数组中元素类型 array([[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]], dtype=int16) >>> empty((2,3)) array([[ 2.65565858e-316, 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000]])
NumPy提供一个类似arange的函数返回一个数列形式的数组:
>>> arange(10, 30, 5) array([10, 15, 20, 25])
以10开始,差值为5的等差数列。该函数不仅接受整数,还接受浮点参数:
>>> arange(0,2,0.5) array([ 0. , 0.5, 1. , 1.5])
当arange使用浮点数参数时,由于浮点数精度有限,通常无法预测获得的元素个数。因此,最好使用函数linspace去接收我们想要的元素个数来代替用range来指定步长。linespace用法如下,将在通用函数一节中详细介绍。
>>> numpy.linspace(-1, 0, 5) array([-1. , -0.75, -0.5 , -0.25, 0. ])
数组中的元素是通过下标来访问的,可以通过方括号括起一个下标来访问数组中单一一个元素,也可以以切片的形式访问数组中多个元素。关于切片访问,将在切片一节介绍。
知识点:NumPy中的数据类型
对于科学计算来说,Python中自带的整型、浮点型和复数类型远远不够,因此NumPy中添加了许多数据类型。如下:
NumPy中的基本数据类型
名称 | 描述 |
bool | 用一个字节存储的布尔类型(True或False) |
inti | 由所在平台决定其大小的整数(一般为int32或int64) |
int8 | 一个字节大小,-128 至 127 |
int16 | 整数,-32768 至 32767 |
int32 | 整数,-2 ** 31 至 2 ** 32 -1 |
int64 | 整数,-2 ** 63 至 2 ** 63 - 1 |
uint8 | 无符号整数,0 至 255 |
uint16 | 无符号整数,0 至 65535 |
uint32 | 无符号整数,0 至 2 ** 32 - 1 |
uint64 | 无符号整数,0 至 2 ** 64 - 1 |
float16 | 半精度浮点数:16位,正负号1位,指数5位,精度10位 |
float32 | 单精度浮点数:32位,正负号1位,指数8位,精度23位 |
float64或float | 双精度浮点数:64位,正负号1位,指数11位,精度52位 |
complex64 | 复数,分别用两个32位浮点数表示实部和虚部 |
complex128或complex | 复数,分别用两个64位浮点数表示实部和虚部 |
NumPy类型转换方式如下:
>>> float64(42) 42.0 >>> int8(42.0) 42 >>> bool(42) True >>> bool(42.0) True >>> float(True) 1.0
许多函数的参数中可以指定参数的类型,当然,这个类型参数是可选的。如下:
>>> arange(7, dtype=uint16) array([0, 1, 2, 3, 4, 5, 6], dtype=uint16)
输出数组
当输出一个数组时,NumPy以特定的布局用类似嵌套列表的形式显示:
第一行从左到右输出
每行依次自上而下输出
每个切片通过一个空行与下一个隔开
一维数组被打印成行,二维数组成矩阵,三维数组成矩阵列表。
>>> a = arange(6) # 1d array >>> print a [0 1 2 3 4 5] >>> b = arange(12).reshape(4,3) # 2d array >>> print b [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] >>> c = arange(24).reshape(2,3,4) # 3d array >>> print c [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]
reshape将在下一篇文章中介绍
如果一个数组太长,则NumPy自动省略中间部分而只打印两端的数据:
>>> print arange(10000) [ 0 1 2 ..., 9997 9998 9999] >>> print arange(10000).reshape(100,100) [[ 0 1 2 ..., 97 98 99] [ 100 101 102 ..., 197 198 199] [ 200 201 202 ..., 297 298 299] ..., [9700 9701 9702 ..., 9797 9798 9799] [9800 9801 9802 ..., 9897 9898 9899] [9900 9901 9902 ..., 9997 9998 9999]]
可通过设置printoptions参数来禁用NumPy的这种行为并强制打印整个数组。
set_printoptions(threshold='nan')
这样,输出时数组的所有元素都会显示出来。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。
更多深入理解NumPy简明教程---数组1相关文章请关注PHP中文网!