创建数组的方式

有几种方法可以创建数组。

例如,您可以使用数组函数从常规Python列表或元组创建数组。

结果数组的类型是从序列中元素的类型推导出来的。

>>> import numpy as np
>>> a = np.array([1,2,3])
>>> a
array([1, 2, 3])
>>> a.dtype
dtype('int64')

>>> b = np.array([1.1, 1.2, 1.3])
>>> b
array([1.1, 1.2, 1.3])
>>> b.dtype
dtype('float64')

多维数组

数组将序列序列转换为二维数组,将序列序列转换为三维数组,等等。

>>> m = np.array([(1,2,3), (4,5,6)])
>>> m
array([[1, 2, 3],
       [4, 5, 6]])
>>> m.dtype
dtype('int64')

新建时指定数据类型

>>> m = np.array([(1,2,3), (4,5,6)], dtype=complex)
>>> m
array([[1.+0.j, 2.+0.j, 3.+0.j],
       [4.+0.j, 5.+0.j, 6.+0.j]])
>>> m.dtype
dtype('complex128')

快速指定初始默认值

通常,数组的元素最初是未知的,但其大小是已知的。

因此,NumPy提供了几个函数来创建具有初始占位符内容的数组。

这些最小化了增加阵列的必要性,这是一项昂贵的操作

函数零创建一个充满零的数组,函数创建一个充满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 )       
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) )     
array([[1., 2., 3.],
       [4., 5., 6.]])

创建数字序列

为了创建数字序列,NumPy提供了一个类似于返回数组而不是列表的范围的函数。

>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> np.arange( 1, 30, 5 )
array([ 1,  6, 11, 16, 21, 26])
>>> np.arange( 0.1, 1, 0.2 )
array([0.1, 0.3, 0.5, 0.7, 0.9])

浮点数精确度问题

当arange与浮点参数一起使用时,由于有限的浮点精度,通常无法预测所获得的元素数。

出于这个原因,通常最好使用函数linspace作为参数接收我们想要的元素数,而不是步骤:

>>> np.linspace( 0, 2, 9 ) 
array([0.  , 0.25, 0.5 , 0.75, 1.  , 1.25, 1.5 , 1.75, 2.  ])

>>> from numpy import pi
>>> x = np.linspace( 0, 2*pi, 100 )  
>>> f = np.sin(x)
>>> f
array([ 0.00000000e+00,  6.34239197e-02,  1.26592454e-01,  1.89251244e-01,
        2.51147987e-01,  3.12033446e-01,  3.71662456e-01,  4.29794912e-01,
        4.86196736e-01,  5.40640817e-01,  5.92907929e-01,  6.42787610e-01,
        6.90079011e-01,  7.34591709e-01,  7.76146464e-01,  8.14575952e-01,
        8.49725430e-01,  8.81453363e-01,  9.09631995e-01,  9.34147860e-01,
        9.54902241e-01,  9.71811568e-01,  9.84807753e-01,  9.93838464e-01,
        9.98867339e-01,  9.99874128e-01,  9.96854776e-01,  9.89821442e-01,
        9.78802446e-01,  9.63842159e-01,  9.45000819e-01,  9.22354294e-01,
        8.95993774e-01,  8.66025404e-01,  8.32569855e-01,  7.95761841e-01,
        7.55749574e-01,  7.12694171e-01,  6.66769001e-01,  6.18158986e-01,
        5.67059864e-01,  5.13677392e-01,  4.58226522e-01,  4.00930535e-01,
        3.42020143e-01,  2.81732557e-01,  2.20310533e-01,  1.58001396e-01,
        9.50560433e-02,  3.17279335e-02, -3.17279335e-02, -9.50560433e-02,
       -1.58001396e-01, -2.20310533e-01, -2.81732557e-01, -3.42020143e-01,
       -4.00930535e-01, -4.58226522e-01, -5.13677392e-01, -5.67059864e-01,
       -6.18158986e-01, -6.66769001e-01, -7.12694171e-01, -7.55749574e-01,
       -7.95761841e-01, -8.32569855e-01, -8.66025404e-01, -8.95993774e-01,
       -9.22354294e-01, -9.45000819e-01, -9.63842159e-01, -9.78802446e-01,
       -9.89821442e-01, -9.96854776e-01, -9.99874128e-01, -9.98867339e-01,
       -9.93838464e-01, -9.84807753e-01, -9.71811568e-01, -9.54902241e-01,
       -9.34147860e-01, -9.09631995e-01, -8.81453363e-01, -8.49725430e-01,
       -8.14575952e-01, -7.76146464e-01, -7.34591709e-01, -6.90079011e-01,
       -6.42787610e-01, -5.92907929e-01, -5.40640817e-01, -4.86196736e-01,
       -4.29794912e-01, -3.71662456e-01, -3.12033446e-01, -2.51147987e-01,
       -1.89251244e-01, -1.26592454e-01, -6.34239197e-02, -2.44929360e-16])

打印数组

print()

>>> a = np.arange(6) 
>>> a
array([0, 1, 2, 3, 4, 5])
>>> print(a)
[0 1 2 3 4 5]
  • 多维数组
>>> m = np.arange(12).reshape(2,6)
>>> m
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
>>> print(m)
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]

太大的数组打印

如果数组太大而无法打印,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=np.nan)

参考资料

array-creation