Numpy的基本使用

下载

numpuy和其他python库一样,可以在命令行中输入下面命令下载。

conda install numpy

你可以输入下面的命令检查自己下载的numpy的版本。

conda list numpy #在命令行中 !conda list numpy #在jupyter notebook中

对于numpy,其核心就是ndarray。ndarray就是n维数组(矩阵),其中的数据必须是相同类型。
在使用numpy之前,需要先引用这个库,一般来说我们使用numpy的缩写np。

import numpy as np

创建ndarray

1.使用常规的python列表方式。
2.使用numpy的内置函数。
我们可以使用numpy的np.array()建立ndarray。

x = np.array([1,2,3,4,5])
print('x = ',x)
x =  [1 2 3 4 5]

使用numpy ndarray可以很直观的获得很多信息。比如说.shape和.dtype内置函数。
.shape可以返回ndarray数组大小,.dtype可以返回ndarray数组存储的数据类型。

x = np.array([1,2,3,4,5])
y = np.array([[1.0,2,3,4,5],[6,7,8,9,10]])
z = np.array(['hello','world'])

print('x = ',x)
print('y = ',y)
print('z = ',z)

print(x.shape)
print(y.shape)
print(z.shape)

print(x.dtype)
print(y.dtype)
print(z.dtype)
x =  [1 2 3 4 5]
y =  [[ 1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10.]]
z =  ['hello' 'world']
(5,)
(2, 5)
(2,)
int32
float64
<U5

我们也可以注意到,尽管y中只有1.0是浮点数,但是因为ndarray只能存储相同类型的元素,所以ndarray会使用向上转型的方式保持数据一致性。在存储字符串的时候,返回数据类型为Unicode。

当然,我们也可以指定ndarray按哪种数据类型储存数据。只需要使用关键字dtype.

x = np.array([1.1,2.2,3.3],dtype = np.int64)

print('x = ',x)
print(x.dtype)
x =  [1 2 3]
int64

numpy还支持将你创建的ndarray保存到文件中或者用在另一个项目。

x = np.array([1,2,3,4,5])

np.save('my_array',x)

这样会将x的数据保存到名称为my_array.npy的文件中。你可以使用load函数将数据下载下来。

y = np.load('my_array.npy')

print('y = ',y)
y =  [1 2 3 4 5]

内置函数

在numpy中有很多有用的内置函数帮我们快速建立一个ndarray。

np.zeros((a,b)),创建一个全是零的ndarray,其中a表示行,b表示列。

x = np.zeros((3,4))
print('x = \n',x)
x = 
 [[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

np.ones((a,b)),创建一个全是1的ndarray数组。

x = np.ones((3,4))
print('x = \n',x)
x = 
 [[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]

上面的那两个函数创建的ndarray数组的数据类型是浮点数,可以使用关键字dtype自己设置。

可以使用np.full创建任何你想要的数字。np.full(shape,constant value)。默认的数据类型和你设置的具体数字保持一致。

x = np.full((3,4),5)
print('x= \n',x)
x= 
 [[5 5 5 5]
 [5 5 5 5]
 [5 5 5 5]]

生成对角矩阵

np.eye(n)可以生成一个n*n的单位矩阵。

x = np.eye(5)

print('x = \n',x)
x = 
 [[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

np.diag()可以生成对角矩阵。

x = np.diag([10,20,30,40])

print('x = \n',x)
x = 
 [[10  0  0  0]
 [ 0 20  0  0]
 [ 0  0 30  0]
 [ 0  0  0 40]]

你可以使用np.arange()函数生成一个具有等差的间隔ndarray。np.arange()函数有三个可选参数。不同的参数有不同的效果。

如果只有一个参数n,那么会生成一个1到n-1的ndarray。

x = np.arange(10)
print('x=',x)
x= [0 1 2 3 4 5 6 7 8 9]

如果有两个参数,那么代表的是np.arange(start,stop),生成一个从start到stop-1的ndarray的数组,间隔为1,不包括stop这个数。

x = np.arange(4,10)
print('x = ',x)
x =  [4 5 6 7 8 9]

如果有三个参数np.arange(start,stop,step),那么会生成一个从start开始,间隔为step,一直到stop-1的ndarray数组。

x = np.arange(1,14,3)
print('x = ',x)
x =  [ 1  4  7 10 13]

虽然arange可以生成等间距ndarray数组,但是如果需要浮点数间隔,最好使用np.linspace()函数。因为arange函数的精确度太低。

np.linspace(start,stop,N)会产生从start到stop等间隔的N个数,start和stop都会被包括。如果只有两个参数,那么N缺省值为50.

x= np.linspace(0,25,10)
print('x = \n',x)
x = 
 [ 0.          2.77777778  5.55555556  8.33333333 11.11111111 13.88888889
 16.66666667 19.44444444 22.22222222 25.        ]

你可以使用endpoint=False使得生成的ndarray不包括stop这个数。

x = np.linspace(0,25,10,endpoint = False)

print('x = ',x)
x =  [ 0.   2.5  5.   7.5 10.  12.5 15.  17.5 20.  22.5]

改变ndarray的外形

使用np.shape()函数可以任意改变ndarray的外形,比如将一个16的数组改变成23.但是无法改变成3*3,那需要9个元素。

x= np.arange(20)
print('x = \n',x)

x = np.reshape(x,(4,5))
print('x = \n',x)
x = 
 [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
x = 
 [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

NumPy可以将函数应用成方法,这样可以简化代码。

x = np.arange(20).reshape(4,5)
print('x = \n',x)
x = 
 [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

当然,reshape方法还可以用在其他函数后面,比如说linspace。

numpy还可以产生随机数组。使用np.random.random(shape)可以产生指定外形的在0.0到1.0的随机数组。

x = np.random.random((3,3))

print('x = \n',x)
x = 
 [[0.73809735 0.30731617 0.64157321]
 [0.05290896 0.49719134 0.27590918]
 [0.91274159 0.65788666 0.32977202]]

我们也可以使用np.random.randint(start,stop.size=shape)产生在start和stop之间的随机数组。

x = np.random.randint(4,15,size=(3,2))

print('x =\n',x)
x =
 [[ 7  5]
 [12  9]
 [ 6  6]]

访问,修改和插入

ndarray支持通过索引访问元素,同时支持正索引和负索引。第一个元素开始是以0开始,访问两维的ndarray可以是用a[row,column]。可以通过索引直接修改元素。

x = np.array([1,2,3,4,5])

print(x[0])
print(x[-1])

x[2]=10
print('x = ',x)
1
5
x =  [ 1  2 10  4  5]

我们也可以添加或删除ndarray中的元素。

删除我们使用的是np.delete(ndarray,element,axis)其中一维的ndarray不需要使用axis关键字。在二维的ndarray中,axis = 0代表的是选中行,axis = 1代表的是选中列。

x = np.array([1,2,3,4,5])
y = np.array([[1,2,3],[4,5,6],[7,8,9]])

x = np.delete(x,[0,4])
w = np.delete(y,0,axis=0)
z=np.delete(y,[0,2],axis=1)

print('x = \n',x)
print('w =\n',w)
print('z =\n',z)
x = 
 [2 3 4]
w =
 [[4 5 6]
 [7 8 9]]
z =
 [[2]
 [5]
 [8]]

np.append(ndarray,elements,axis)函数可以给ndarray后面添加元素。axis的用法和上边相同。

如果是想要给ndarray数组中插入数据,可以使用np.insert(ndarray,index,elements,axis)。其中index表示将数据插入到什么地方。注意下面例子的一些细节。

x = np.array([1,2,5,6,7,8])
y = np.array([[1,2,3],[7,8,9]])

x = np.insert(x,2,[3,4])
print('x = \n',x)

w = np.insert(y,1,[4,5,6],axis=0)
v = np.insert(y,1,5,axis=1)

print('w =\n',w)
print('v =\n',v)
x = 
 [1 2 3 4 5 6 7 8]
w =
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
v =
 [[1 5 2 3]
 [7 5 8 9]]

NumPy还支持将两个ndarray组合在一起,有两个内置函数。np.vstack()是垂直组合在一起,np.hstack是水平组合在一起。注意一定要形状匹配才行。

x = np.array([1,2])
y = np.array([[3,4],[5,6]])

z = np.vstack((x,y))
w = np.hstack((y,x.reshape(2,1)))

print('z=\n',z)
print('w =\n',w)
z=
 [[1 2]
 [3 4]
 [5 6]]
w =
 [[3 4 1]
 [5 6 2]]

切片

在NumPy中,我们可以很简单的获得ndarray的子集,有三种方式。

1.ndarray[start:end]

2.ndarray[start:]

3.ndarray[:end]

需要注意的是,第一种和最后一种是不包括end元素的。如果ndarray是二维数组,只需要再多加一个参数限定就行。

x = np.arange(20).reshape(4,5)
print('x =\n',x)

z= x[1:4,2:5]
print('z = \n',z)

w = x[1:,2:5]
print('z=\n',z)

q = x[:,2]
print('q =\n',q)

r=x[:,2:3]
print('r=\n',r)
x =
 [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
z = 
 [[ 7  8  9]
 [12 13 14]
 [17 18 19]]
z=
 [[ 7  8  9]
 [12 13 14]
 [17 18 19]]
q =
 [ 2  7 12 17]
r=
 [[ 2]
 [ 7]
 [12]
 [17]]

注意q是一个一维数组,而r是二维的。,

令人很困惑的是通过切片x创建的这些变量并非是将x的值复制过去了,这些变量实际上是和x不同名称的同一个ndarray数组。可以看下面的例子理解一下。

x= np.arange(20).reshape(4,5)

z=x[1:4,2:5]
print('z = \n',z)

z[2,2]=555
print('x =\n',x)
z = 
 [[ 7  8  9]
 [12 13 14]
 [17 18 19]]
x =
 [[  0   1   2   3   4]
 [  5   6   7   8   9]
 [ 10  11  12  13  14]
 [ 15  16  17  18 555]]

为了解决这个问题,我们可以使用np.copy()函数,当然这个函数也可以当方法使用。利用这个函数可以创造出独立的ndarray数组。

x = np.arange(20).reshape(4,5)

z = np.copy(x[1:4,2:5])
w = x[1:4,2:5].copy()

z[2,2]=555
w[2,2]=444

print('z=\n',z)
print('w=\n',w)
print('x=\n',x)
z=
 [[  7   8   9]
 [ 12  13  14]
 [ 17  18 555]]
w=
 [[  7   8   9]
 [ 12  13  14]
 [ 17  18 444]]
x=
 [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

我们也可以使用一个ndarray当作一些函数的参数。

x = np.arange(20).reshape(4,5)
indices = np.array([1,3])

y = x[indices,:]
print('y=\n',y)
y=
 [[ 5  6  7  8  9]
 [15 16 17 18 19]]

numpy可以使用np.diag(ndarray,k=n)来提取对角线上的元素。当k=0时,代表的是主对角线上的元素,k>0提取主对角线上面的对角线,k<0代表下面的。

np.unique(ndarray)函数可以去重,将数组中的元素只提取一个。

x = np.array([[1,2,3],[5,2,8],[1,2,3]])

print(np.unique(x))
[1 2 3 5 8]

布尔索引

NumPy还支持布尔索引,可以更方便的选择需要的元素。

比如说选取特定大小范围的元素。

x = np.arange(25).reshape(5,5)

x[(x>10)& (x<17)] = -1

print('x =\n',x)
x =
 [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 -1 -1 -1 -1]
 [-1 -1 17 18 19]
 [20 21 22 23 24]]

NumPy还有排序的函数sort,如果将sort当作函数使用,那么ndarray的值是不会改变的,如果当作方法来使用,那么排序好的值会代替原来的值。

x = np.random.randint(1,11,size=(10,))

print('x=\n',x)

print('x =\n',np.sort(x))

print('x =\n',x)
x.sort()
print('x =\n',x)
x=
 [3 3 3 6 5 3 2 5 8 1]
x =
 [1 2 3 3 3 3 5 5 6 8]
x =
 [3 3 3 6 5 3 2 5 8 1]
x =
 [1 2 3 3 3 3 5 5 6 8]

sort函数不会删除重复的元素,如果想要删除重复出现的元素。可以使用np.unique(x)函数。

print(np.sort(np.unique(x)))
[1 2 3 5 6 8]

如果是二维数组,我们可以使用关键字axis来确定是按行还是按列排序。用法和之前一样。

计算和广播机制

numpy支持元素层次上的操作,这一操作依赖于numpy的广播机制。ndarray支持加,减,乘,除操作。可以使用+或者函数np.add()的方式操作。

x = np.array([1,2,3,4])
y = np.array([5.5,6.5,7.5,8.5])

print('x+y= ',x+y)
print('add(x,y)=',np.add(x,y))

x+y=  [ 6.5  8.5 10.5 12.5]
add(x,y)= [ 6.5  8.5 10.5 12.5]

其他的操作类似,函数分别为np.add(),np.subtract(x,y),np.multiply(x,y),np.divide(x,y)。二维数组同样适用,不过必须形状一样或者符合被广播的要求。

当然,还有其他的函数,比如说,sqrt()函数,可以计算平方根。

NumPy还有许多数据统计共嫩的函数,有兴趣可以自己了解。

X = np.array([[1,2], [3,4]])

print()
print('X = \n', X)
print()

print('Average of all elements in X:', X.mean())
print('Average of all elements in the columns of X:', X.mean(axis=0))
print('Average of all elements in the rows of X:', X.mean(axis=1))
print()
print('Sum of all elements in X:', X.sum())
print('Sum of all elements in the columns of X:', X.sum(axis=0))
print('Sum of all elements in the rows of X:', X.sum(axis=1))
print()
print('Standard Deviation of all elements in X:', X.std())
print('Standard Deviation of all elements in the columns of X:', X.std(axis=0))
print('Standard Deviation of all elements in the rows of X:', X.std(axis=1))
print()
print('Median of all elements in X:', np.median(X))
print('Median of all elements in the columns of X:', np.median(X,axis=0))
print('Median of all elements in the rows of X:', np.median(X,axis=1))
print()
print('Maximum value of all elements in X:', X.max())
print('Maximum value of all elements in the columns of X:', X.max(axis=0))
print('Maximum value of all elements in the rows of X:', X.max(axis=1))
print()
print('Minimum value of all elements in X:', X.min())
print('Minimum value of all elements in the columns of X:', X.min(axis=0))
print('Minimum value of all elements in the rows of X:', X.min(axis=1))
X = 
 [[1 2]
 [3 4]]

Average of all elements in X: 2.5
Average of all elements in the columns of X: [2. 3.]
Average of all elements in the rows of X: [1.5 3.5]

Sum of all elements in X: 10
Sum of all elements in the columns of X: [4 6]
Sum of all elements in the rows of X: [3 7]

Standard Deviation of all elements in X: 1.118033988749895
Standard Deviation of all elements in the columns of X: [1. 1.]
Standard Deviation of all elements in the rows of X: [0.5 0.5]

Median of all elements in X: 2.5
Median of all elements in the columns of X: [2. 3.]
Median of all elements in the rows of X: [1.5 3.5]

Maximum value of all elements in X: 4
Maximum value of all elements in the columns of X: [3 4]
Maximum value of all elements in the rows of X: [2 4]

Minimum value of all elements in X: 1
Minimum value of all elements in the columns of X: [1 2]
Minimum value of all elements in the rows of X: [1 3]

NumPy还支持加(减,乘,除)一个数,效果就是ndarray中每一个元素都加(减,乘,除)这个数。这个用到的就是numpy的广播机制。

numpy数组还可以这样相加。

x = np.array([1,2,3])
y = np.array([[1,2,3],[4,5,6],[7,8,9]])

print('x+y=\n',x+y)
x+y=
 [[ 2  4  6]
 [ 5  7  9]
 [ 8 10 12]]

如果还想了解更多广播机制,可以点这个了解链接

参考文档:
udacity教程


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值