python基础之numpy

来源:互联网 发布:php数组最大长度限制 编辑:程序博客网 时间:2024/05/22 15:47

附教程链接:https://mohttps://morvanzhou.github.io/tutorials/data-manipulation/np-pd/rvanzhou.github.io/tutorials/data-manipulation/np-pd/

In[1]:

import numpy as np #为了方便使用numpy 采用np简写

In[2]:

array = np.array([[1,2,3],[2,3,4]]) #列表转化为矩阵
print(array)
“””
array([[1, 2, 3],
[2, 3, 4]])
“”“

In[3]:

print(‘number of dim:’,array.ndim) # 维度

number of dim: 2

print(‘shape :’,array.shape) # 行数和列数

shape : (2, 3)

print(‘size:’,array.size) # 元素个数

size: 6

In[4]:

创建数组

a = np.array([2,23,4]) # list 1d
print(a)

In[5]:

指定数据dtype

a = np.array([2,23,4],dtype=np.int)
print(a.dtype)

int 64

a = np.array([2,23,4],dtype=np.int32)
print(a.dtype)

int32

a = np.array([2,23,4],dtype=np.float)
print(a.dtype)

float64

a = np.array([2,23,4],dtype=np.float32)
print(a.dtype)

float32

In[8]:

创建特定数据

a = np.array([[2,23,4],[2,32,4]]) # 2d 矩阵 2行3列
print(a)
“””
[[ 2 23 4]
[ 2 32 4]]
“””
a = np.zeros((3,4)) # 数据全为0,3行4列
“””
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
“””
print(a)

a = np.ones((3,4),dtype = np.int) # 数据为1,3行4列
print(a)
“””
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
“”“

a = np.empty((3,4)) # 数据为empty(接近0),3行4列
print(a)
“””
array([[ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324,
1.48219694e-323],
[ 1.97626258e-323, 2.47032823e-323, 2.96439388e-323,
3.45845952e-323],
[ 3.95252517e-323, 4.44659081e-323, 4.94065646e-323,
5.43472210e-323]])
“”“

a = np.arange(10,20,2) # 10-19 的数据,2步长
print(a)
“””
array([10, 12, 14, 16, 18])
“”“

a = np.arange(12).reshape((3,4)) # 3行4列,0到11
print(a)
“””
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
“”“

a = np.linspace(1,10,20) # 开始端1,结束端10,且分割成20个数据,生成线段
print(a)
“””
array([ 1. , 1.47368421, 1.94736842, 2.42105263,
2.89473684, 3.36842105, 3.84210526, 4.31578947,
4.78947368, 5.26315789, 5.73684211, 6.21052632,
6.68421053, 7.15789474, 7.63157895, 8.10526316,
8.57894737, 9.05263158, 9.52631579, 10. ])
“”“

a = np.linspace(1,10,20).reshape((5,4)) # 更改shape
print(a)
“””
array([[ 1. , 1.47368421, 1.94736842, 2.42105263],
[ 2.89473684, 3.36842105, 3.84210526, 4.31578947],
[ 4.78947368, 5.26315789, 5.73684211, 6.21052632],
[ 6.68421053, 7.15789474, 7.63157895, 8.10526316],
[ 8.57894737, 9.05263158, 9.52631579, 10. ]])
“”“

In[9]:

Numpy 基础运算1

a=np.array([10,20,30,40]) # array([10, 20, 30, 40])
b=np.arange(4) # array([0, 1, 2, 3])
c=a-b
print(c)# array([10, 19, 28, 37])
c=a+b
print(c)# array([10, 21, 32, 43])
c=a*b
print(c)# array([ 0, 20, 60, 120])
c=b**2
print(c)# array([0, 1, 4, 9])
c=10*np.sin(a)
print(c) # array([-5.44021111, 9.12945251, -9.88031624, 7.4511316 ])

print(b<3) # array([ True, True, True, False], dtype=bool)

a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))

print(a)

array([[1, 1],

[0, 1]])

print(b)

array([[0, 1],

[2, 3]])

c_dot = np.dot(a,b)

array([[2, 4],

[2, 3]])

c_dot_2 = a.dot(b)#另外的一种关于dot的表示方法

array([[2, 4],

[2, 3]])

In[11]:

a=np.random.random((2,4))
print(a)

c=np.sum(a)
print(c)

c=np.min(a)
print(c)

c=np.max(a)
print(c)

print(“a =”,a)

print(“sum =”,np.sum(a,axis=1))#axis的值为0的时候,将会以列作为查找单元, 当axis的值为1的时候,将会以行作为查找单元。
print(“min =”,np.min(a,axis=0))
print(“max =”,np.max(a,axis=1))

In[12]:

Numpy 基础运算2:

A = np.arange(2,14).reshape((3,4))

array([[ 2, 3, 4, 5]

[ 6, 7, 8, 9]

[10,11,12,13]])

print(np.argmin(A)) # 0
print(np.argmax(A)) # 11

中的 argmin() 和 argmax() 两个函数分别对应着求矩阵中最小元素和最大元素的索引。

相应的,在矩阵的12个元素中,最小值即2,对应索引0,最大值为13,对应索引为11。

In[13]:

print(np.mean(A)) # 7.5 求均值的三种方法
print(np.average(A)) # 7.5
print(A.mean()) # 7.5

In[16]:

print(np.cumsum(A))

在cumsum()函数中:生成的每一项矩阵元素均是从原矩阵首项累加到对应项的元素之和。

比如元素9,在cumsum()生成的矩阵中序号为3,即原矩阵中2,3,4三个元素的和。

[2 5 9 14 20 27 35 44 54 65 77 90]

In[17]:

print(np.diff(A))

该函数计算的便是每一行中后一项与前一项之差。

[[1 1 1]

[1 1 1]

[1 1 1]]

In[18]:

print(np.nonzero(A))

这个函数将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。

(array([0,0,0,0,1,1,1,1,2,2,2,2]),array([0,1,2,3,0,1,2,3,0,1,2,3]))

即非0的元素有A01 A02 A03 A04 A11……

In[19]:

A = np.arange(14,2, -1).reshape((3,4))

我们可以对所有元素进行仿照列表一样的排序操作,但这里的排序函数仍然仅针对每一行进行从小到大排序操作

array([[14, 13, 12, 11],

[10, 9, 8, 7],

[ 6, 5, 4, 3]])

print(np.sort(A))

array([[11,12,13,14]

[ 7, 8, 9,10]

[ 3, 4, 5, 6]])

In[24]:

矩阵的转置有两种表示方法

print(np.transpose(A),’\n’)

print(A.T)

array([[14,10, 6]

[13, 9, 5]

[12, 8, 4]

[11, 7, 3]])

array([[14,10, 6]

[13, 9, 5]

[12, 8, 4]

[11, 7, 3]])

In[29]:

在Numpy中具有clip()函数 这个函数的格式是clip(Array,Array_min,Array_max),

顾名思义,Array指的是将要被执行用的矩阵,

而后面的最小值最大值则用于让函数判断矩阵中元素是否有比最小值小的或者比最大值大的元素,

并将这些指定的元素转换为最小值或者最大值。

print(A,’\n’)

array([[14,13,12,11]

[10, 9, 8, 7]

[ 6, 5, 4, 3]])

print(np.clip(A,5,9))

array([[ 9, 9, 9, 9]

[ 9, 9, 8, 7]

[ 6, 5, 5, 5]])

In[30]:

Numpy 索引

A = np.arange(3,15)

array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

print(A[3]) # 6

In[31]:

A = np.arange(3,15).reshape((3,4))
“””
array([[ 3, 4, 5, 6]
[ 7, 8, 9, 10]
[11, 12, 13, 14]])
“”“

print(A[2])

[11 12 13 14] A[2]对应的就是矩阵A中第三行(从0开始算第一行)的所有元素。

In[33]:

print(A[1][1]) # 表示具体的单个元素,有两种方法
print(A[1, 1]) # 8

In[34]:

print(A[1, 1:3]) # [8 9] 切片 针对第二行中第2到第4列元素进行切片输出(不包含第4列)。矩阵下标从0开始,切前不切后。

In[35]:

for row in A:
print(row)#它会逐行进行打印操作
“””
[ 3, 4, 5, 6]
[ 7, 8, 9, 10]
[11, 12, 13, 14]
“”“

In[36]:

for column in A.T:
print(column) #对A进行转置,再将得到的矩阵逐行输出即可得到原矩阵的逐列输出
“””
[ 3, 7, 11]
[ 4, 8, 12]
[ 5, 9, 13]
[ 6, 10, 14]
“”“

In[38]:

A = np.arange(3,15).reshape((3,4))

print(A.flatten())

array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

for item in A.flat:
print(item) #flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列。而flat是一个迭代器,本身是一个object属性

3

4

14

In[51]:

Numpy array 合并

A = np.array([1,1,1])
B = np.array([2,2,2])
print(A,’\n’) #这里的A是数组。不是矩阵。
print(np.vstack((A,B))) # vertical stack
“””
[[1,1,1]
[2,2,2]]
“”“

vertical stack本身属于一种上下合并,即对括号中的两个整体进行对应操作。此时我们对组合而成的矩阵进行属性探究:

In[49]:

D = np.hstack((A,B)) # horizontal stack

print(D)

[1,1,1,2,2,2]

print(A.shape,D.shape)

这里的shape后面不要加()否则会报错

(3,) (6,)

D本身来源于A,B两个数列的左右合并,而且新生成的D本身也是一个含有6项元素的序列。

In[57]:

A是序列, 转置操作便很有可能无法对其进行转置(因为A并不是矩阵的属性),此时就需要我们借助其他的函数操作进行转置

print(A[np.newaxis])
“””
The newaxis object can be used in all slicing operations to create an axis of length one.
newaxis is an alias for ‘None’, and ‘None’ can be used in place of this with the same result.
[[1 1 1]]
“””
print(A[np.newaxis,:].shape)

(1,3)

print(A[:,np.newaxis])

逗号前创建行,逗号后创建列

“””
[[1]
[1]
[1]]
“””
print(A[:,np.newaxis].shape)

(3,1)

In[60]:

综合起来

A = np.array([1,1,1])[np.newaxis,:]
B = np.array([2,2,2])[np.newaxis,:]

C = np.vstack((A,B)) # vertical stack
D = np.hstack((A,B)) # horizontal stack
print(C,’\n’)
print(D,’\n’)

print(A.shape,D.shape)

In[61]:

C = np.concatenate((A,B,B,A),axis=0)

你的合并操作需要针对多个矩阵或序列时,借助concatenate函数可能会让你使用起来比前述的函数更加方便

axis参数很好的控制了矩阵的纵向或是横向打印,0是上下打印,1是左右。

print(C,’\n’)

D = np.concatenate((A,B,B,A),axis=1)

print(D)

In[69]:

Numpy array 切片

A = np.arange(12).reshape((3, 4))
print(A)
print(A[0:2:1,0:2:1])#逗号前对行切片,逗号后对列切片
print(A[0:2:1,0:3:1])

In[72]:

Numpy array 分割

A = np.arange(12).reshape((3, 4))
print(A)
print(np.split(A, 2, axis=1))#纵向分割 平均切成两份
print(np.split(A, 3, axis=0))#横向分割 注 0是上下切,即切成行 1是左右切,即切成列 而且只能对等切 即切成两边都相同的

In[89]:

print(np.array_split(A, 2, axis=1))#不等量的分割
print(np.array_split(A, [1,2], axis=1))#制定切割位置

In[90]:

其他的分割方式

print(np.vsplit(A, 3)) #等于 print(np.split(A, 3, axis=0))

[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]

print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1))
“””
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
“”“

In[92]:

Numpy copy & deep copy

a = np.arange(4)

array([0, 1, 2, 3])

b = a
c = a
d = b
print(a,’\n’,b,’\n’,c,’\n’,d,’\n’)

= 的赋值方式会带有关联性 改变a的第一个值,b、c、d的第一个值也会同时改变。

a[0] = 11
print(a)

array([11, 1, 2, 3])

print(b,’\n’,c,’\n’,d,’\n’)

同样更改d的值,a、b、c也会改变。

In[93]:

copy()的赋值方式没有关联性

b = a.copy() # deep copy
print(b) # array([11, 22, 33, 3])
a[3] = 44
print(a) # array([11, 22, 33, 44])
print(b) # array([11, 22, 33, 3])

原创粉丝点击