NumPy学习笔记(2)--Array数组和矩阵基本运算

原创 2017年02月17日 12:52:06

numpy还是很强大的,这里把一些矩阵基本操作做一些整理,方便大家,也方便我自己码代码的时候查找。

有句话对于我这个初学者来说觉得还是挺符合的,翻书看视频浏览教程贴啊什么的,会发现很多知识点,一开始并不用非得记下都有些什么函数,问题是好像也记不住,学过去之后只要知道这个东西它都能实现什么些什么功能能干些什么事就够了,在你写程序的时候你需要实现什么,这时候再去查找就足够了,用着用着自然就记住了。

犹记得那时候苦翻C++ Primer Plus那本书时的悲痛,学语言不用的话真是看后面忘前面。

1.函数库的导入

import numpy #或者
import numpy as np

2.基本运算

2.1.求和 .sum()
2.2.求最大值 .max()
2.3.求最小值 .min()
2.4.求平均值 .mean()

import numpy as np
test1 = np.array([[5, 10, 15],
            [20, 25, 30],
            [35, 40, 45]])
test1.sum()
# 输出 225
test1.max()
# 输出 45
test1.min()
# 输出 5
test1.mean()
# 输出 25.0

2.5.矩阵行求和 .sum(axis=1)

test1 = np.array([[5, 10, 15],
            [20, 25, 30],
            [35, 40, 45]])
test1.sum(axis=1)
# 输出 array([30, 75, 120])

2.6.矩阵列求和 .sum(axis=0)

test1 = np.array([[5, 10, 15],
            [20, 25, 30],
            [35, 40, 45]])
test1.sum(axis=0)
# 输出 array([60, 75, 90])

2.7.矩阵乘法

import numpy as np
a = np.array([[1, 2],
              [3, 4]])
b = np.array([[5, 6],
              [7, 8]])
print (a*b) # 对应位置元素相乘
print (a.dot(b)) # 矩阵乘法
print (np.dot(a, b)) # 矩阵乘法,同上
# 输出 [[5 12]
       [21 32]]
      [[19 22]
       [43 50]]
      [[19 22]
       [43 50]]  

2.8.元素求平方: a**2

a = np.range(4)
print (a)
print (a**2)
# 输出 [0, 1, 2, 3]
      [0, 1, 4, 9]

2.9.元素求e的n次幂: np.exp(test)
元素开根号: np.sqrt(test)

import numpy as np
test = np.arange(3)
print (test)
print (np.exp(test)) #e的n次幂
print (np.sqrt(test)) #开根号
# 输出 [0 1 2]
    [1. 2.71828183 7.3890561]
    [0 1. 1.41421356]

2.10.向下取整: .floor()

import numpy as np
test = np.floor(10*np.random.random((3, 4)))
print (test)
# 输出 [[ 3.  8.  7.  0.]
     [ 5.  9.  8.  2.]
     [ 3.  0.  9.  0.]]

2.11.平坦化数组: .ravel()

# 二维n行n列转换为一维数组
test.ravel()
# 输出 array([ 3.,  8.,  7.,  0.,  5.,  9.,  8.,  2.,  3.,  0.,  9.,  0.]) 
# 数据接上面,下同

2.12.矩阵转置: .T

test.shape = (6, 2)
print (test)
# 输出 [[ 3.  8.]
 [ 7.  0.]
 [ 5.  9.]
 [ 8.  2.]
 [ 3.  0.]
 [ 9.  0.]]
test.T # test的转置
# 输出 array([[ 3.,  7.,  5.,  8.,  3.,  9.],
       [ 8.,  0.,  9.,  2.,  0.,  0.]])

2.13.矩阵拼接按行: np.vstack((a, b))
矩阵拼接按列: np.hstack((a, b))

import numpy as np
a = np.floor(10*np.random.random((2, 2)))
b = np.floor(10*np.random.random((2, 2)))
print (a)
print ('---')
print (b)
print ('---')
print (np.vstack((a, b))) # 按行拼接,也就是竖方向拼接
print ('---')
print (np.hstack((a, b))) # 按列拼接,也就是横方向拼接
# 输出 [[ 5.  3.]
 [ 8.  0.]]
---
[[ 3.  0.]
 [ 6.  3.]]
---
[[ 5.  3.]
 [ 8.  0.]
 [ 3.  0.]
 [ 6.  3.]]
---
[[ 5.  3.  3.  0.]
 [ 8.  0.  6.  3.]]

2.14.矩阵分割按列: np.hsplit(a, 3) 和 np.hsplit(a, (3, 4))

import numpy as np
a = np.floor(10*np.random.random((2, 12)))
print (a)
# 输出 [[ 6.  7.  5.  7.  9.  1.  2.  3.  1.  9.  5.  7.]
 [ 6.  5.  2.  0.  1.  7.  8.  2.  7.  0.  5.  9.]]
print (np.hsplit(a, 3)) # 按列分割,也就是横方向分割,参数a为要分割的矩阵,参数3为分成三份
print ('---')
print (np.hsplit(a, (3, 4))) # 参数(3, 4)为在维度3前面也就是第4列前切一下,在维度4也就是第5列前面切一下
# 输出 [array([[ 6.,  7.,  5.,  7.],
       [ 6.,  5.,  2.,  0.]]), array([[ 9.,  1.,  2.,  3.],
       [ 1.,  7.,  8.,  2.]]), array([[ 1.,  9.,  5.,  7.],
       [ 7.,  0.,  5.,  9.]])]
---
[array([[ 6.,  7.,  5.],
       [ 6.,  5.,  2.]]), array([[ 7.],
       [ 0.]]), array([[ 9.,  1.,  2.,  3.,  1.,  9.,  5.,  7.],
       [ 1.,  7.,  8.,  2.,  7.,  0.,  5.,  9.]])]

2.15.矩阵分割按行: np.vsplit(a, 3) 和 np.vsplit(a, (3, 4))

import numpy as np
a = np.floor(10*np.random.random((12, 2)))
print (a)
# 输出 [[ 5.  4.]
 [ 8.  7.]
 [ 3.  1.]
 [ 6.  0.]
 [ 4.  4.]
 [ 4.  5.]
 [ 2.  4.]
 [ 7.  3.]
 [ 1.  6.]
 [ 6.  9.]
 [ 2.  1.]
 [ 3.  0.]]
print (np.vsplit(a, 3)) # 按行分割,也就是横竖方向分割,参数a为要分割的矩阵,参数3为分成三份
print ('---')
print (np.vsplit(a, (3, 4))) # 参数(3, 4)为在维度3前面也就是第4行前切一下,在维度4也就是第5行前面切一下
# 输出 [array([[ 5.,  4.],
       [ 8.,  7.],
       [ 3.,  1.],
       [ 6.,  0.]]), array([[ 4.,  4.],
       [ 4.,  5.],
       [ 2.,  4.],
       [ 7.,  3.]]), array([[ 1.,  6.],
       [ 6.,  9.],
       [ 2.,  1.],
       [ 3.,  0.]])]
---
[array([[ 5.,  4.],
       [ 8.,  7.],
       [ 3.,  1.]]), array([[ 6.,  0.]]), array([[ 4.,  4.],
       [ 4.,  5.],
       [ 2.,  4.],
       [ 7.,  3.],
       [ 1.,  6.],
       [ 6.,  9.],
       [ 2.,  1.],
       [ 3.,  0.]])]

2.16.查找并修改矩阵特定元素
例如下面代码中,x_data是我代码中的一个矩阵,但是矩阵数据中有缺失值是用?表示的,我要做一些数据处理,就需要把?换掉,比如换成0

x_data[x_data == '?'] = 0

3.创建数组: .array
首先需要创建数组才能对其进行其它操作,通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多维数组(如c):

import numpy as np
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]])
print (a)
print ('---')
print (b)
print ('---')
print (c)
# 输出 [1 2 3 4]
---
[5 6 7 8]
---
[[ 1  2  3  4]
 [ 4  5  6  7]
 [ 7  8  9 10]]
  • 若导入numpy用的是import numpy命令,那么在创建数组的时候用a = numpy.array([1, 2, 3, 4])的形式
  • 若导入numpy用的是import numpy as np命令,那么用 a = np.array([1, 2, 3, 4])

4.查询数据类型: .dtype

# 接上面数据
print (c.dtype)
# 输出 int32

关于数据类型:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。

4.1.创建时指定元素类型

import numpy as np
a = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
b = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]], dtype='str')
print (a)
print ('---')
print (b)
# 输出 [[ 1  2  3  4]
 [ 4  5  6  7]
 [ 7  8  9 10]]
---
[['1' '2' '3' '4']
 ['4' '5' '6' '7']
 ['7' '8' '9' '10']]

4.2.转换数据类型: .astype

# 接上面数据
b = b.astype(int)
print (b)
# 输出 [[ 1  2  3  4]
 [ 4  5  6  7]
 [ 7  8  9 10]]

4.3. array数组的数据类型

bool -- True , False
int -- int16 , int32 , int64
float -- float16 , float32 , float64
string -- string , unicode

5.查询矩阵的大小: .shape

import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
print (a.shape)
print ('---')
print (b.shape)
# 输出 (4,)
---
(3, 4)

(4, )shape有一个元素即为一维数组,数组中有4个元素
(3, 4)shape有两个元素即为二维数组,数组为3行4列

5.1.通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度。下面的例子将数组b的shape改为(4, 3),从(3, 4)改为(4, 3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变:

b.shape = 4, 3
print (b)
# 输出 [[ 1  2  3]
 [ 4  4  5]
 [ 6  7  7]
 [ 8  9 10]]

5.2.当某个轴的元素为-1时,将根据数组元素的个数自动计算该轴的长度,下面程序将数组b的shape改为了(2, 6):

b.shape = 2, -1
print (b)
# 输出 [[ 1  2  3  4  4  5]
 [ 6  7  7  8  9 10]]

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

a = np.array((1, 2, 3, 4))
b = a.reshape((2, 2))
b
# 输出 array([[1, 2],
       [3, 4]])

6.复制(1): =
a和b共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改另外一个数组或矩阵的内容:

a[2] = 100 # 将数组a的第3个元素改为100,数组d中的2即第三个元素也发生了改变
b
# 输出 array([[1, 2],
       [100, 4]])
import numpy as np
a = np.arange(12)
b = a

print (a)
print (b)
print (b is a) # 判断b是a?
# 输出 [ 0  1  2  3  4  5  6  7  8  9 10 11]
    [ 0  1  2  3  4  5  6  7  8  9 10 11]
    True

b.shape = 3, 4
print (a.shape)
# 输出 (3, 4)

print (id(a))
print (id(b))
# 输出 2239367199840
    2239367199840

7.复制(2)–浅复制: .view()

# The view method creates a new array object that looks at the same data.

import numpy as np
a = np.arange(12)
b = a.view() # b是新创建出来的数组,但是b和a共享数据

b is a # 判断b是a?
# 输出 False
print (b)
# 输出 [ 0  1  2  3  4  5  6  7  8  9 10 11]
b.shape = 2, 6 # 改变b的shape,a的shape不会受影响
print (a.shape)
print (b)
# 输出 (12,)
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
b[0, 4] = 1234 # 改变b第1行第5列元素为1234,a对应位置元素受到影响
print (b)
# 输出 [[   0    1    2    3 1234    5]
         [   6    7    8    9   10   11]]
print (a)
# 输出 [   0    1    2    3 1234    5    6    7    8    9   10   11]

8.复制(3)–深复制: .copy()

# The copy method makes a complete copy of the array and its data.

import numpy as np
a = np.arange(12)
a.shape = 3, 4
a[1, 0] = 1234

c = a.copy()
c is a
c[0, 0] = 9999 # 改变c元素的值,不会影响a的元素
print (c)
print (a)
# 输出 [[9999    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]
[[   0    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]

9.查询维度: .ndim

import numpy as np
a = np.array([[5, 10, 15],
       [20, 25, 30],
       [35, 40, 45]])
a.ndim
# 输出 2

10.查询元素个数: .size

import numpy as np
a = np.array([[5, 10, 15],
       [20, 25, 30],
       [35, 40, 45]])
a.size
# 输出 9

11.创建0矩阵: .zeros

np.zeros((3, 4)) # 创建3行4列的0矩阵
np.zeros((3, 4), dtype=np.str) # 可以在创建的时候指定数据类型

12.创建1矩阵: .ones

np.noes((3, 4)) # 创建3行4列的1矩阵

13.区间内按等差创建矩阵: .arange

np.arange(10, 30, 5) # 10开始到30,没加5生成一个元素
# 输出array([10, 15, 20, 25])
# 可以通过修改shape属性改变维度,参考上文

np.arange(0, 2, 0.3) # 0开始到2,没加0.3生成一个元素
# 输出array([0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])

np.arange(12).reshape(3, 4) # 从0开始每加1共生成12个元素,并通过reshape设定矩阵大小为3行4列
# 输出array([[0, 1, 2, 3],
             [4, 5, 6, 7],
             [8, 9, 10, 11]])

np.random.random((2, 3)) # 生成2行3列矩阵,元素为0-1之间的随机值

14.区间内按元素个数取值: .linspace

from numpy import pi
np.linspace(0, 2*pi, 100) # 0到2*pi,取100个值

15.利用==判断数组或矩阵中是否存在某个值

这里写图片描述

将判断结果赋给某个变量

这里写图片描述

一次判断多个条件

这里写图片描述
对于矩阵来说情况也是一样的

版权声明:本文为博主原创文章,未经博主允许不得转载。

numpy.array 操作简单总结

python numpy.array 操作总结
  • net_wolf_007
  • net_wolf_007
  • 2016年06月21日 13:20
  • 25059

NumPy简明教程(二、数组2)

NumPy数组(2、数组的操作) 基本运算 数组的算术运算是按元素逐个运算。数组运算后将创建包含运算结果的新数组。 >>> a= np.array([20,30,40,50]) >>> b=...
  • sunny2038
  • sunny2038
  • 2013年06月07日 22:49
  • 78910

NumPy简明教程(二、数组1)

NumPy数组(1、数组初探) NumPy数组 NumPy数组是一个多维数组对象,称为ndarray。其由两部分组成: 实际的数据描述这些数据的元数据 大部分操作仅针对于元数据,而不改变底层实际的...
  • sunny2038
  • sunny2038
  • 2013年05月31日 22:57
  • 259035

论numpy中matrix 和 array的区别

Numpy matrices are strictly 2-dimensional, while numpy arrays (ndarrays) are N-dimensional. Matrix o...
  • vincentlipan
  • vincentlipan
  • 2014年03月07日 16:26
  • 23803

Python之数组(array)使用方法总结与Numpy中的数组用法

Python:
  • u010956473
  • u010956473
  • 2017年06月02日 12:56
  • 3285

Python中的二维数组(list与numpy.array)

关于python中的二维数组,主要有list和numpy.array两种。 好吧,其实还有matrices,但它必须是2维的,而numpy arrays (ndarrays) 可以是多维的。 我们...
  • qq_30490125
  • qq_30490125
  • 2016年05月18日 16:53
  • 31024

Pandas模块入门(一)——Series结构介绍

Pandas模块是Python用于数据导入及整理的模块,对数据挖掘前期数据的处理工作十分有用,因此这些基础的东西还是要好好的学学。Pandas模块的数据结构主要有两:1、Series ;2、DataF...
  • u014607457
  • u014607457
  • 2016年05月01日 13:40
  • 8690

Python Numpy 数组的初始化和基本操作

一.基础:Numpy的主要数据类型是ndarray,即多维数组。它有以下几个属性:ndarray.ndim:数组的维数 ndarray.shape:数组每一维的大小 ndarray.size:数组...
  • Baoli1008
  • Baoli1008
  • 2016年01月17日 13:56
  • 78204

Numpy基础笔记

Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。其部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。 用于对整组数据...
  • hickai
  • hickai
  • 2014年04月11日 11:17
  • 51419

numpy中array和asarray的区别

array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。 举例说明: i...
  • Gobsd
  • Gobsd
  • 2017年02月22日 14:45
  • 10408
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NumPy学习笔记(2)--Array数组和矩阵基本运算
举报原因:
原因补充:

(最多只允许输入30个字)