ndarray.ndim
数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。
ndarray.shape
数组的维度。这是一个整数的元组,表示每个维度中数组的大小。对于具有n行和m列的矩阵,shape
将是(n,m)
。因此,shape
元组的长度就是rank或维度的个数ndim
。
ndarray.size
数组元素的总数。这等于shape
的元素的乘积。
ndarray.dtype
描述数组中元素类型的对象。可以使用标准Python类型创建或指定dtype。另外NumPy提供了自己的类型。例如numpy.int32、numpy.int16和numpy.float64。
ndarray.itemsize
数组中每个元素的字节大小。例如,元素为float64
类型的数组的itemsize
为8(=64/8),而complex32
类型的数组的comitemsize
为4(=32/8)。它等于ndarray.dtype.itemsize
。
创建数组的几种方法
>>> import numpy as np
>>> a = np.array([2,3,4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')
>>> b = np.array([(1.5,2,3), (4,5,6)]) >>> b array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]])
数组的类型也可以在创建时明确指定:
>>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
>>> c
array([[ 1.+0.j, 2.+0.j],
[ 3.+0.j, 4.+0.j]])
能够创建数组的几个函数
NumPy提供了几个函数来创建具有初始占位符内容的数组。
函数zeros
创建一个由0组成的数组,函数ones
创建一个由1数组的数组,函数empty
内容是随机的并且取决于存储器的状态。默认情况下,创建的数组的dtype为float64
。
>>> np.zeros( (3,4) )
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
>>> np.ones( (2,3,4), dtype=np.int16 ) # dtype can also be specified
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)
>>> np.empty( (2,3) ) # uninitialized, output may vary
array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],
[ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
为了创建数字序列,NumPy提供类似于range
的函数,返回数组而不是列表。
>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> np.arange( 0, 2, 0.3 ) # it accepts float arguments
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
当arange
与浮点参数一起使用时,由于浮点数的精度是有限的,通常不可能预测获得的元素数量。出于这个原因,通常最好使用函数linspace
,它接收我们想要的元素数量而不是步长作为参数:
>>> from numpy import pi
>>> np.linspace( 0, 2, 9 ) # 9 numbers from 0 to 2
array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
>>> x = np.linspace( 0, 2*pi, 100 ) # useful to evaluate function at lots of points
>>> f = np.sin(x)
另见
array
, zeros
, zeros_like
, ones
, ones_like
, empty
, empty_like
, arange
, linspace
,numpy.random.rand
, numpy.random.randn
, fromfunction
, fromfile
打印数组
如果数组太大而无法打印,NumPy会自动跳过数组的中心部分,并只打印边角:
>>> print(np.arange(10000))
[ 0 1 2 ..., 9997 9998 9999]
>>>
>>> print(np.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]]
要禁用此行为并强制NumPy打印整个数组,你可以使用set_printoptions
更改打印选项。
>>> np.set_printoptions(threshold='nan')
基本操作
数组上的算术运算符使用元素级别。将创建一个新数组并用结果填充。
>>> a = np.array( [20,30,40,50] )
>>> b = np.arange( 4 )
>>> b
array([0, 1, 2, 3])
>>> c = a-b
>>> c
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9])
>>> 10*np.sin(a)
array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
>>> a<35
array([ True, True, False, False], dtype=bool)
与许多矩阵语言不同,乘法运算符*
的运算在NumPy数组中是元素级别的。可以使用dot
函数或方法执行矩阵乘积:
>>> A = np.array( [[1,1],
... [0,1]] )
>>> B = np.array( [[2,0],
... [3,4]] )
>>> A*B # elementwise product
array([[2, 0],
[0, 4]])
>>> A.dot(B) # matrix product
array([[5, 4],
[3, 4]])
>>> np.dot(A, B) # another matrix product
array([[5, 4],
[3, 4]])