Numpy(Python)创建数组方式

Numpy(Python)创建数组方式

首先我们要知道为什么要使用numpy。
python是一门高级汇编语言,标准的Python中用列表(list)保存一组值,可以当作数组使用。但由于列表的元素可以是任何对象,因此列表中保存的是对象的指针。对于数值运算来说,这种结构显然比较浪费内存和CPU计算。
为了节省计算时间和节省内存空间,我们可以使用Numpy来弥补其中不足。
(小技巧:键盘Home键可以让光标移动到本行最左,而End键可以让光标移动到末尾,先用Home将光标移动到左侧,再按住Shift+End即可圈选本行)

先按照习惯导入numpy

import numpy as np

输入“np.array()” 可以通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多维数组(下例中的变量c):

>>> a = np.array([1, 2, 3, 4])
>>> b = np.array((5, 6, 7, 8))
>>> c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]]) 
>>> b 
array([5, 6, 7, 8]) 
>>> c 
array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]) 
>>> c.dtype #数组的元素类型可以通过dtype 属性获得 dtype('int32')

数组的大小可以通过其shape属性获得:

>>> a.shape #一维数组 (4L,)
>>> c.shape #二维数组其中第0 轴的长度为3,第1 轴的长度为4
 (3L, 4L)

可以通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度。

>>> c.shape = 4,3
>>> c 
array([[ 1, 2, 3], [ 4, 4, 5], [ 6, 7, 7], [ 8, 9, 10]])

#注意从(3,4)改为(4,3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变:

>>> c.shape = 2,-1
>>> c 
array([[ 1, 2, 3, 4, 4, 5],
 [ 6, 7, 7, 8, 9, 10]])

#当某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度,因此下面的程序将数组c的 shape改为了(2,6)。

>>> d = a.reshape((2,2)) 
>>> d array([[1, 2], 
[3, 4]]) 
>>>> a array([1, 2, 3, 4])

#使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变。

一、创建数组

1.arange

类似于python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值:

>>> np.arange(0,1,0.1) 
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])

2.linspace

通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值:

>>> np.linspace(0, 1, 10) # 步长为1/9 
array([ 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ]) 
>>> np.linspace(0, 1, 10, endpoint=False) # 步长为1/10 
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])

3.logspace

和linspace类似,不过它创建等比数列,下面的例子产生1(100)到100(102)、有20个元素的等比数列:

>>> np.logspace(0, 2, 20) 

array([ 1. , 1.27427499, 1.62377674, 2.06913808,
2.6366509 , 3.35981829, 4.2813324 , 5.45559478,
6.95192796, 8.8586679 , 11.28837892, 14.38449888, 
18.32980711, 23.35721469, 29.76351442, 37.92690191,
48.32930239, 61.58482111, 78.47599704, 100. ])

4.zeros、ones、empty

创建指定形状和类型的数组。

>>> np.empty((2,3),np.int) #只分配内存,不对其进行初始化 
array([[ 32571594, 32635312, 505219724],
 [ 45001384, 1852386928, 665972]]) 
>>> np.zeros(4, np.float) #元素类型默认为np.float,因此这里可以省略 
array([ 0., 0., 0., 0.])

5.fromfunction

>>> def func(i): 
return i%4+1 

>>> np.fromfunction(func, (10,)) 
array([ 1., 2., 3., 4., 1., 2., 3., 4., 1., 2.])

fromfunction函数的第一个参数为计算每个数组元素的函数,第二个参数为数组的大小(shape)。

>>> def func2(i, j): 
return (i+1) * ( j+1) 
>>> a = np.fromfunction(func2, (9,9)) 
>>> a 
array([[ 1., 2., 3., 4., 5., 6., 7., 8., 9.], 
[ 2., 4., 6., 8., 10., 12., 14., 16., 18.], 
[ 3., 6., 9., 12., 15., 18., 21., 24., 27.], 
[ 4., 8., 12., 16., 20., 24., 28., 32., 36.], 
[ 5., 10., 15., 20., 25., 30., 35., 40., 45.], 
[ 6., 12., 18., 24., 30., 36., 42., 48., 54.], 
[ 7., 14., 21., 28., 35., 42., 49., 56., 63.], 
[ 8., 16., 24., 32., 40., 48., 56., 64., 72.], 
[ 9., 18., 27., 36., 45., 54., 63., 72., 81.]])

矩阵形式(主要是以坐标i,j为自变量函数比较方便)

6.random.rand(n)

创建n个0-1的随机数数组

>>>x=np.random.rand(10)
>>>x
array([0.97520257, 0.68184737, 0.61750545, 0.14097668, 0.72720486,
       0.65235402, 0.38819762, 0.51943454, 0.38636835, 0.37297904])

使数组每个元素和0.5进行比较,分到一个布尔数组(True/False)

>>> x>0.5
array([ True,  True,  True, False,  True,  True, False,  True, False,
       False])

二、创建矩阵

通过reshape行数可以形成列向量
通过列向量与行向量相加可以直接获得两向量行列分别相加得到的矩阵

>>>np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6) 
array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55]])

你可能感兴趣的:(Python)