python 数据分析 numpy基础

NumPy - Ndarray 对象

NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型。 它描述相同类型的元素集合。 可以使用基于零的索引访问集合中的项目。

ndarray类的实例可以通过本教程后面描述的不同的数组创建例程来构造。 基本的ndarray是使用 NumPy 中的数组函数创建的,如下所示:

numpy.array
numpy基础  创建数组
import numpy as np
array = np.array([[1,2,3],
				[2,3,4]])
print(array)
array.ndim     几维
array.ahape    (2,3) 2行3列
array.size      大小


np.array([[2,3,4]
		[3,3,4]],dtpye = np.int64)
                         np.float32)创建矩阵及类型
 a= np.zeros((3,4),dtype = np.int16) 创建一个三行四列的全是0 的矩阵            
     np. ones((3,4))     全是1
     np.empty((3,4))      接近空一个矩阵
改变矩阵形状
a = np.arrane(10,20,2)    一个从10 到20 步调为2 的矩阵、
a = np.arrange(12).reshape((3,4))    改变形状到三行四列
a = np .linspace(1,10,20).reshape 直线矩阵

#int8,int16,int32,int64 可替换为等价的字符串 'i1','i2','i4',以及其他。  
import numpy as np 

dt = np.dtype('i4')  
print dt
# 一维数组  
import numpy as np 
a = np.arange(24) a.ndim 
# 现在调整其大小
b = a.reshape(2,4,3)  
print b 
# b 现在拥有三个维度输出如下:
[[[ 0,  1,  2] 
  [ 3,  4,  5] 
  [ 6,  7,  8] 
  [ 9, 10, 11]]  
  [[12, 13, 14] 
   [15, 16, 17]
   [18, 19, 20] 
   [21, 22, 23]]]

numpy.itemsize

这一数组属性返回数组中每个元素的字节单位长度。

示例 1

# 数组的 dtype 为 int8(一个字节)  
import numpy as np 
x = np.array([1,2,3,4,5], dtype = np.int8)  
print x.itemsize   输出如下
1

示例 2

# 数组的 dtype 现在为 float32(四个字节)  
import numpy as np 
x = np.array([1,2,3,4,5], dtype = np.float32)  
print x.itemsize

输出如下:

4

frombuffer示例
import numpy as np s = 'Hello World' a = np.frombuffer(s, dtype = 'S1') print a

输出如下:

['H'  'e'  'l'  'l'  'o'  ' '  'W'  'o'  'r'  'l'  'd']

numpy.linspace

此函数类似于arange()函数。 在此函数中,指定了范围之间的均匀间隔数量,而不是步长。 此函数的用法如下。

numpy.linspace(start, stop, num, endpoint, retstep, dtype)

构造器接受下列参数:

序号参数及描述
1.start 序列的起始值
2.stop 序列的终止值,如果endpointtrue,该值包含于序列中
3.num 要生成的等间隔样例数量,默认为50
4.endpoint 序列中是否包含stop值,默认为ture
5.retstep 如果为true,返回样例,以及连续数字之间的步长
6.dtype 输出ndarray的数据类型

下面的例子展示了linspace函数的用法。

示例 1

import numpy as np
x = np.linspace(10,20,5)  
print x

输出如下:

[10.   12.5   15.   17.5  20.]

示例 2

# 将 endpoint 设为 false
import numpy as np
x = np.linspace(10,20,  5, endpoint =  False)  
print x

输出如下:

[10.   12.   14.   16.   18.]

示例 2

这个例子使用了~(取补运算符)来过滤NaN

import numpy as np 
a = np.array([np.nan,  1,2,np.nan,3,4,5])  
print a[~np.isnan(a)]

输出如下:

[ 1.   2.   3.   4.   5.]

NumPy - 广播

术语广播是指 NumPy 在算术运算期间处理不同形状的数组的能力。 对数组的算术运算通常在相应的元素上进行。 如果两个阵列具有完全相同的形状,则这些操作被无缝执行。

示例 1

import numpy as np 

a = np.array([1,2,3,4]) 
b = np.array([10,20,30,40]) 
c = a * b 
print c

输出如下:

[10   40   90   160]

如果两个数组的维数不相同,则元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。 较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。

如果满足以下规则,可以进行广播:

  • ndim较小的数组会在前面追加一个长度为 1 的维度。

  • 输出数组的每个维度的大小是输入数组该维度大小的最大值。

  • 如果输入在每个维度中的大小与输出大小匹配,或其值正好为 1,则在计算中可它。

  • 如果输入的某个维度大小为 1,则该维度中的第一个数据元素将用于该维度的所有计算。

如果上述规则产生有效结果,并且满足以下条件之一,那么数组被称为可广播的

  • 数组拥有相同形状。

  • 数组拥有相同的维数,每个维度拥有相同长度,或者长度为 1。

  • 数组拥有极少的维度,可以在其前面追加长度为 1 的维度,使上述条件成立。

下面的例称展示了广播的示例。

示例 2

import numpy as np 
a = np.array([[0.0,0.0,0.0],[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]]) 
b = np.array([1.0,2.0,3.0])  
print  '第一个数组:'  
print a 
print  '\n'  
print  '第二个数组:'  
print b 
print  '\n'  
print  '第一个数组加第二个数组:'  
print a + b

输出如下:

第一个数组:
[[ 0. 0. 0.]
 [ 10. 10. 10.]
 [ 20. 20. 20.]
 [ 30. 30. 30.]]

第二个数组:
[ 1. 2. 3.]

第一个数组加第二个数组:
[[ 1. 2. 3.]
 [ 11. 12. 13.]
 [ 21. 22. 23.]
 [ 31. 32. 33.]]

下面的图片展示了数组b如何通过广播来与数组a兼容。

NumPy广播


NumPy - 数组上的迭代

NumPy 包包含一个迭代器对象numpy.nditer。 它是一个有效的多维迭代器对象,可以用于在数组上进行迭代。 数组的每个元素可使用 Python 的标准Iterator接口来访问。

让我们使用arange()函数创建一个 3X4 数组,并使用nditer对它进行迭代。

示例 1

import numpy as np
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print  '原始数组是:'  
print a print  '\n'  
print  '修改后的数组是:'  
for x in np.nditer(a):  
    print x,

       
       
Python

输出如下:

原始数组是:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

修改后的数组是:
0 5 10 15 20 25 30 35 40 45 50 55

numpy.ndarray.flat

该函数返回数组上的一维迭代器,行为类似 Python 内建的迭代器。

例子

import numpy as np
a = np.arange(8).reshape(2,4)
print '原始数组:'
print a
print '\n'

print '调用 flat 函数之后:'
# 返回展开数组中的下标的对应元素
print a.flat[5]

       
       
Python

输出如下:

原始数组:
[[0 1 2 3]
 [4 5 6 7]]

调用 flat 函数之后:
5

numpy.ndarray.flatten

该函数返回折叠为一维的数组副本,函数接受下列参数:

ndarray.flatten(order)

       
       
Python

其中:

  • order'C' — 按行,'F' — 按列,'A' — 原顺序,'k' — 元素在内存中的出现顺序。

例子

import numpy as np
a = np.arange(8).reshape(2,4)

print '原数组:'
print a
print '\n'  
# default is column-major

print '展开的数组:'
print a.flatten()
print '\n'  

print '以 F 风格顺序展开的数组:'
print a.flatten(order = 'F')

       
       
Python

输出如下:

原数组:
[[0 1 2 3]
 [4 5 6 7]]

展开的数组:
[0 1 2 3 4 5 6 7]

以 F 风格顺序展开的数组:
[0 4 1 5 2 6 3 7]

numpy.concatenate

数组的连接是指连接。 此函数用于沿指定轴连接相同形状的两个或多个数组。 该函数接受以下参数。

numpy.concatenate((a1, a2, ...), axis)

       
       
Python

其中:

  • a1, a2, ...:相同类型的数组序列
  • axis:沿着它连接数组的轴,默认为 0

例子

import numpy as np
a = np.array([[1,2],[3,4]])

print '第一个数组:'
print a
print '\n'  
b = np.array([[5,6],[7,8]])

print '第二个数组:'
print b
print '\n'  
# 两个数组的维度相同

print '沿轴 0 连接两个数组:'
print np.concatenate((a,b))
print '\n'  

print '沿轴 1 连接两个数组:'
print np.concatenate((a,b),axis = 1)

       
       
Python

输出如下:

第一个数组:
[[1 2]
 [3 4]]

第二个数组:
[[5 6]
 [7 8]]

沿轴 0 连接两个数组:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

沿轴 1 连接两个数组:
[[1 2 5 6]
 [3 4 7 8]]

numpy.stack

此函数沿新轴连接数组序列。 此功能添加自 NumPy 版本 1.10.0。 需要提供以下参数。

numpy.stack(arrays, axis)

       
       
Python

其中:

  • arrays:相同形状的数组序列
  • axis:返回数组中的轴,输入数组沿着它来堆叠
import numpy as np
a = np.array([[1,2],[3,4]])

print '第一个数组:'
print a
print '\n'
b = np.array([[5,6],[7,8]])

print '第二个数组:'
print b
print '\n'  

print '沿轴 0 堆叠两个数组:'
print np.stack((a,b),0)
print '\n'  

print '沿轴 1 堆叠两个数组:'
print np.stack((a,b),1)

       
       
Python

输出如下:

第一个数组:
[[1 2]
 [3 4]]

第二个数组:
[[5 6]
 [7 8]]

沿轴 0 堆叠两个数组:
[[[1 2]
 [3 4]]
 [[5 6]
 [7 8]]]

沿轴 1 堆叠两个数组:
[[[1 2]
 [5 6]]
 [[3 4]
 [7 8]]]

numpy.hstack

numpy.stack函数的变体,通过堆叠来生成水平的单个数组。

例子

import numpy as np
a = np.array([[1,2],[3,4]])

print '第一个数组:'
print a
print '\n'  
b = np.array([[5,6],[7,8]])

print '第二个数组:'
print b
print '\n'  

print '水平堆叠:'
c = np.hstack((a,b))
print c
print '\n'

       
       
Python

输出如下:

第一个数组:
[[1 2]
 [3 4]]

第二个数组:
[[5 6]
 [7 8]]

水平堆叠:
[[1 2 5 6]
 [3 4 7 8]]

numpy.vstack

numpy.stack函数的变体,通过堆叠来生成竖直的单个数组。

import numpy as np
a = np.array([[1,2],[3,4]])

print '第一个数组:'
print a
print '\n'  
b = np.array([[5,6],[7,8]])

print '第二个数组:'
print b
print '\n'

print '竖直堆叠:'
c = np.vstack((a,b))
print c

       
       
Python

输出如下:

第一个数组:
[[1 2]
 [3 4]]

第二个数组:
[[5 6]
 [7 8]]

竖直堆叠:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

数组分割

序号数组及操作
1.split 将一个数组分割为多个子数组
2.hsplit 将一个数组水平分割为多个子数组(按列)
3.vsplit 将一个数组竖直分割为多个子数组(按行)

numpy.split

该函数沿特定的轴将数组分割为子数组。函数接受三个参数:

numpy.split(ary, indices_or_sections, axis)

其中:

  • ary:被分割的输入数组
  • indices_or_sections:可以是整数,表明要从输入数组创建的,等大小的子数组的数量。 如果此参数是一维数组,则其元素表明要创建新子数组的点。
  • axis:默认为 0

例子

import numpy as np
a = np.arange(9)

print '第一个数组:'
print a
print '\n'  

print '将数组分为三个大小相等的子数组:'
b = np.split(a,3)
print b
print '\n'  

print '将数组在一维数组中表明的位置分割:'
b = np.split(a,[4,7])
print b

       
       
Python

输出如下:

第一个数组:
[0 1 2 3 4 5 6 7 8]

将数组分为三个大小相等的子数组:
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]

将数组在一维数组中表明的位置分割:
[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]

numpy.hsplit

numpy.hsplitsplit()函数的特例,其中轴为 1 表示水平分割,无论输入数组的维度是什么。

import numpy as np
a = np.arange(16).reshape(4,4)

print '第一个数组:'
print a
print '\n'  

print '水平分割:'
b = np.hsplit(a,2)
print b
print '\n'

       
       
Python

输出:

第一个数组:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]
 [12 13 14 15]]

水平分割:                                                         
[array([[ 0,  1],                                                             
       [ 4,  5],                                                              
       [ 8,  9],                                                              
       [12, 13]]), array([[ 2,  3],                                           
       [ 6,  7],                                                              
       [10, 11],                                                              
       [14, 15]])]

numpy.vsplit

numpy.vsplitsplit()函数的特例,其中轴为 0 表示竖直分割,无论输入数组的维度是什么。下面的例子使之更清楚。

import numpy as np
a = np.arange(16).reshape(4,4)

print '第一个数组:'
print a
print '\n'

print '竖直分割:'
b = np.vsplit(a,2)
print b

       
       
Python

输出如下:

第一个数组:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]
 [12 13 14 15]]

竖直分割:                                                           
[array([[0, 1, 2, 3],                                                         
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],                               
       [12, 13, 14, 15]])]

numpy.append

此函数在输入数组的末尾添加值。 附加操作不是原地的,而是分配新的数组。 此外,输入数组的维度必须匹配否则将生成ValueError

函数接受下列函数:

numpy.append(arr, values, axis)

其中:

  • arr:输入数组
  • values:要向arr添加的值,比如和arr形状相同(除了要添加的轴)
  • axis:沿着它完成操作的轴。如果没有提供,两个参数都会被展开。

例子

import numpy as np
a = np.array([[1,2,3],[4,5,6]])

print '第一个数组:'
print a
print '\n'  

print '向数组添加元素:'
print np.append(a, [7,8,9])
print '\n'  

print '沿轴 0 添加元素:'
print np.append(a, [[7,8,9]],axis = 0)
print '\n'  

print '沿轴 1 添加元素:'
print np.append(a, [[5,5,5],[7,8,9]],axis = 1)

       
       
Python

输出如下:

第一个数组:
[[1 2 3]
 [4 5 6]]

向数组添加元素:
[1 2 3 4 5 6 7 8 9]

沿轴 0 添加元素:
[[1 2 3]
 [4 5 6]
 [7 8 9]]

沿轴 1 添加元素:
[[1 2 3 5 5 5]
 [4 5 6 7 8 9]]

numpy.insert

此函数在给定索引之前,沿给定轴在输入数组中插入值。 如果值的类型转换为要插入,则它与输入数组不同。 插入没有原地的,函数会返回一个新数组。 此外,如果未提供轴,则输入数组会被展开。

insert()函数接受以下参数:

numpy.insert(arr, obj, values, axis)

       
       
Python

其中:

  • arr:输入数组
  • obj:在其之前插入值的索引
  • values:要插入的值
  • axis:沿着它插入的轴,如果未提供,则输入数组会被展开

例子

import numpy as np
a = np.array([[1,2],[3,4],[5,6]])

print '第一个数组:'
print a
print '\n'  

print '未传递 Axis 参数。 在插入之前输入数组会被展开。'
print np.insert(a,3,[11,12])
print '\n'  
print '传递了 Axis 参数。 会广播值数组来配输入数组。'

print '沿轴 0 广播:'
print np.insert(a,1,[11],axis = 0)
print '\n'  

print '沿轴 1 广播:'
print np.insert(a,1,11,axis = 1)

       
       
Python

numpy.delete

此函数返回从输入数组中删除指定子数组的新数组。 与insert()函数的情况一样,如果未提供轴参数,则输入数组将展开。 该函数接受以下参数:

Numpy.delete(arr, obj, axis)

       
       
Python

其中:

  • arr:输入数组
  • obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组
  • axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开

例子

import numpy as np
a = np.arange(12).reshape(3,4)

print '第一个数组:'
print a
print '\n'  

print '未传递 Axis 参数。 在插入之前输入数组会被展开。'
print np.delete(a,5)
print '\n'  

print '删除第二列:'  
print np.delete(a,1,axis = 1)
print '\n'  

print '包含从数组中删除的替代值的切片:'
a = np.array([1,2,3,4,5,6,7,8,9,10])
print np.delete(a, np.s_[::2])

       
       
Python

输出如下:

第一个数组:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]

未传递 Axis 参数。 在插入之前输入数组会被展开。
[ 0 1 2 3 4 6 7 8 9 10 11]

删除第二列:
[[ 0 2 3]
 [ 4 6 7]
 [ 8 10 11]]

包含从数组中删除的替代值的切片:
[ 2 4 6 8 10]

numpy.unique

此函数返回输入数组中的去重元素数组。 该函数能够返回一个元组,包含去重数组和相关索引的数组。 索引的性质取决于函数调用中返回参数的类型。

numpy.unique(arr, return_index, return_inverse, return_counts)

       
       
Python

其中:

  • arr:输入数组,如果不是一维数组则会展开
  • return_index:如果为true,返回输入数组中的元素下标
  • return_inverse:如果为true,返回去重数组的下标,它可以用于重构输入数组
  • return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数

例子

import numpy as np
a = np.array([5,2,6,2,7,5,6,8,2,9])

print '第一个数组:'
print a
print '\n'  

print '第一个数组的去重值:'
u = np.unique(a)
print u
print '\n'  

print '去重数组的索引数组:'
u,indices = np.unique(a, return_index = True)
print indices
print '\n'  

print '我们可以看到每个和原数组下标对应的数值:'
print a
print '\n'  

print '去重数组的下标:'
u,indices = np.unique(a,return_inverse = True)
print u
print '\n'

print '下标为:'
print indices
print '\n'  

print '使用下标重构原数组:'
print u[indices]
print '\n'  

print '返回去重元素的重复数量:'
u,indices = np.unique(a,return_counts = True)
print u
print indices

       
       
Python

输出如下:

第一个数组:
[5 2 6 2 7 5 6 8 2 9]

第一个数组的去重值:
[2 5 6 7 8 9]

去重数组的索引数组:
[1 0 2 4 7 9]

我们可以看到每个和原数组下标对应的数值:
[5 2 6 2 7 5 6 8 2 9]

去重数组的下标:
[2 5 6 7 8 9]

下标为:
[1 0 2 0 3 1 2 4 0 5]

使用下标重构原数组:
[5 2 6 2 7 5 6 8 2 9]

返回唯一元素的重复数量:
[2 5 6 7 8 9]
 [3 2 2 1 1 1]

numpy的字符串操作

numpy.char.add()

函数执行按元素的字符串连接。

import numpy as np 
print '连接两个字符串:' 
print np.char.add(['hello'],[' xyz']) 
print '\n'

print '连接示例:' 
print np.char.add(['hello', 'hi'],[' abc', ' xyz'])

      
      
Python

输出如下:

连接两个字符串:
['hello xyz']

连接示例:
['hello abc' 'hi xyz']

numpy.char.multiply()

这个函数执行多重连接。

import numpy as np 
print np.char.multiply('Hello ',3)

      
      
Python

输出如下:

Hello Hello Hello

      
      
Python

numpy.char.center()

此函数返回所需宽度的数组,以便输入字符串位于中心,并使用fillchar在左侧和右侧进行填充。

import numpy as np 
# np.char.center(arr, width,fillchar) 
print np.char.center('hello', 20,fillchar = '*')

      
      
Python

输出如下:

*******hello********

舍入函数

numpy.around()

这个函数返回四舍五入到所需精度的值。 该函数接受以下参数。

numpy.around(a,decimals)

      
      
Python

其中:

序号参数及描述
1.a 输入数组
2.decimals 要舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置

示例

numpy与科学计算
import numpy as np
a = np.array([1.0,5.55,  123,  0.567,  25.532])  
print  '原数组:'  
print a
print  '\n'  
print  '舍入后:'  
print np.around(a)  
print np.around(a, decimals =  1)  
print np.around(a, decimals =  -1)

      
      
Python

输出如下:

原数组:                                                          
[   1.       5.55   123.       0.567   25.532]

舍入后:                                                         
[   1.    6.   123.    1.   26. ]                                               
[   1.    5.6  123.    0.6  25.5]                                          
[   0.    10.  120.    0.   30. ]

numpy.floor()

此函数返回不大于输入参数的最大整数。 即标量x 的下限是最大的整数i ,使得i <= x。 注意在Python中,向下取整总是从 0 舍入。

示例

import numpy as np
a = np.array([-1.7,  1.5,  -0.2,  0.6,  10])  
print  '提供的数组:'  
print a
print  '\n'  
print  '修改后的数组:'  
print np.floor(a)

      
      
Python

输出如下:

提供的数组:                                                            
[ -1.7   1.5  -0.2   0.6  10. ]

修改后的数组:                                                         
[ -2.   1.  -1.   0.  10.]

numpy.ceil()

ceil()函数返回输入值的上限,即,标量x的上限是最小的整数i ,使得i> = x

示例

import numpy as np
a = np.array([-1.7,  1.5,  -0.2,  0.6,  10])  
print  '提供的数组:'  
print a
print  '\n'  
print  '修改后的数组:'  
print np.ceil(a)

      
      
Python

输出如下:

提供的数组:
[ -1.7   1.5  -0.2   0.6  10. ]

修改后的数组:
[ -1.   2.  -0.   1.  10.]

NumPy - 算数运算

用于执行算术运算(如add()subtract()multiply()divide())的输入数组必须具有相同的形状或符合数组广播规则。

示例

import numpy as np 
a = np.arange(9, dtype = np.float_).reshape(3,3)  
print  '第一个数组:'  
print a 
print  '\n'  
print  '第二个数组:' 
b = np.array([10,10,10])  
print b 
print  '\n'  
print  '两个数组相加:'  
print np.add(a,b)  
print  '\n'  
print  '两个数组相减:'  
print np.subtract(a,b)  
print  '\n'  
print  '两个数组相乘:'  
print np.multiply(a,b)  
print  '\n'  
print  '两个数组相除:'  
print np.divide(a,b)

      
      
Python

输出如下:

第一个数组:
[[ 0. 1. 2.]
 [ 3. 4. 5.]
 [ 6. 7. 8.]]

第二个数组:
[10 10 10]

两个数组相加:
[[ 10. 11. 12.]
 [ 13. 14. 15.]
 [ 16. 17. 18.]]

两个数组相减:
[[-10. -9. -8.]
 [ -7. -6. -5.]
 [ -4. -3. -2.]]

两个数组相乘:
[[ 0. 10. 20.]
 [ 30. 40. 50.]
 [ 60. 70. 80.]]

两个数组相除:
[[ 0. 0.1 0.2]
 [ 0.3 0.4 0.5]






a = np.array([1,2,3])
b = np. array([2,3,4])
print a+b 
print a-b
print a**2   a 的平方
print 10*np.sin(a) 
print  10*np.cos(b)




print  b
print b<3    \
print b==3      # ture  fasle 








a= n.array([1,2,3],
[2,3,4])
b= np.array([3,4,5],
[2,3,4])


print  a*b    对应位置相乘
print np.dot(a,b)  a与bde 矩阵相乘
      a.dot(b)








import numpy as np
a = np. random.random((2,4))
print (s)
print (np.sum(a))
print (np.sum(a,axis=1))   行求和
print (np.min(a,axis=0))  列求最小
print(np.max(a)   矩阵求最大


print(np.argmin(a))   最下索引
print(np.argmax(a))   最大索引
print(np.mean(a))      求a 的平均值
print(np.average(a))
print(a.mean())




print   (np.median(a))   求中位数


print(np.cumsum(a)   求累加
print (np.diff(a))   求累差


print (np.nonzero(a))    求矩阵内各元素的行数何列数
print(np.sort(a))    求排序
print  (np.transpose(a))    矩阵的逆     对称过来的
print(a.T)  矩阵的转置


print(np.clip(a,5,9))   截取矩阵   小于5的 赋值5 大于9 的赋值9
print(np.mean(a,axis=0))   列内求平均值




print(a)
print(a[2]      第三行
print(a([2][1]) 第三行第二个
print(a[2,1])  d等价于上面
print(a[;,1:2])   指定范围
  






for row in a:


print (row)  迭代行
 
for column in a.T:
print(column)  迭代列


for item in a.flat:   把矩阵变成一行
print(item)    迭代元素








 a=np.array([1,1,])
 b=np.array([2,2,2]


c= np.vstack((a,b))    上下 合并
d= np.hstack((a,b))    左右合并


print(a[np.newaxis,:])  与 print(a[:,np.newaxis])  单行与单列矩阵之间的转换
 第一个 行编列              第二个列变行
e= np.concatenate((a,b),axis=1)   行向合并




矩阵的分割




a= np.arange(12).reshape(3,4)
print (np.spilt(a,2,axis=1))   在 列方向对等分割为两份
print(np.array_apilt(a,3,axis=1))   在列方向不对等的分割
print(np.vspilt(a,3))     列向分割
print(np.hspilt(a,2)      行向分割








a=array([1,2,3,4])
b=a
c=a
d=b


a[1]=11  赋值a矩阵b,c,a,也跟着改变 因为  a就是b就是c就是d


e=a.copy()   #deepcopy     此时e矩阵不会跟着a 矩阵的改变而改变

numpy.ptp()

numpy.ptp()函数返回沿轴的值的范围(最大值 - 最小值)。

import numpy as np 
a = np.array([[3,7,5],[8,4,3],[2,4,9]])  
print  '我们的数组是:'  
print a 
print  '\n'  
print  '调用 ptp() 函数:'  
print np.ptp(a)  
print  '\n'  
print  '沿轴 1 调用 ptp() 函数:'  
print np.ptp(a, axis =  1)  
print  '\n'  
print  '沿轴 0 调用 ptp() 函数:'  
print np.ptp(a, axis =  0)

  
  
Python

输出如下:

我们的数组是:
[[3 7 5]
[8 4 3]
[2 4 9]]

调用 ptp() 函数:
7

沿轴 1 调用 ptp() 函数:
[4 5 7]

沿轴 0 调用 ptp() 函数:
[6 3 6]

numpy.percentile()

百分位数是统计中使用的度量,表示小于这个值得观察值占某个百分比。 函数numpy.percentile()接受以下参数。

numpy.percentile(a, q, axis)

  
  
Python

其中:

序号参数及描述
1.a 输入数组
2.q 要计算的百分位数,在 0 ~ 100 之间
3.axis 沿着它计算百分位数的轴

示例

import numpy as np 
a = np.array([[30,40,70],[80,20,10],[50,90,60]])  
print  '我们的数组是:'  
print a 
print  '\n'  
print  '调用 percentile() 函数:'  
print np.percentile(a,50)  
print  '\n'  
print  '沿轴 1 调用 percentile() 函数:'  
print np.percentile(a,50, axis =  1)  
print  '\n'  
print  '沿轴 0 调用 percentile() 函数:'  
print np.percentile(a,50, axis =  0)

  
  
Python

输出如下:

我们的数组是:
[[30 40 70]
 [80 20 10]
 [50 90 60]]

调用 percentile() 函数:
50.0

沿轴 1 调用 percentile() 函数:
[ 40. 20. 60.]

沿轴 0 调用 percentile() 函数:
[ 50. 40. 60.]

NumPy - 排序、搜索和计数函数

NumPy中提供了各种排序相关功能。 这些排序函数实现不同的排序算法,每个排序算法的特征在于执行速度,最坏情况性能,所需的工作空间和算法的稳定性。 下表显示了三种排序算法的比较。

种类速度最坏情况工作空间稳定性
'quicksort'(快速排序)1O(n^2)0
'mergesort'(归并排序)2O(n*log(n))~n/2
'heapsort'(堆排序)3O(n*log(n))0

numpy.sort()

sort()函数返回输入数组的排序副本。 它有以下参数:

numpy.sort(a, axis, kind, order)

  
  
Python

其中:

序号参数及描述
1.a 要排序的数组
2.axis 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序
3.kind 默认为'quicksort'(快速排序)
4.order 如果数组包含字段,则是要排序的字段

示例

import numpy as np  
a = np.array([[3,7],[9,1]])  
print  '我们的数组是:'  
print a 
print  '\n'  
print  '调用 sort() 函数:'  
print np.sort(a)  
print  '\n'  
print  '沿轴 0 排序:'  
print np.sort(a, axis =  0)  
print  '\n'  
# 在 sort 函数中排序字段 
dt = np.dtype([('name',  'S10'),('age',  int)]) 
a = np.array([("raju",21),("anil",25),("ravi",  17),  ("amar",27)], dtype = dt)  
print  '我们的数组是:'  
print a 
print  '\n'  
print  '按 name 排序:'  
print np.sort(a, order =  'name')

  
  
Python

输出如下:

我们的数组是:
[[3 7]
 [9 1]]

调用 sort() 函数:
[[3 7]
 [1 9]]

沿轴 0 排序:
[[3 1]
 [9 7]]

我们的数组是:
[('raju', 21) ('anil', 25) ('ravi', 17) ('amar', 27)]

按 name 排序:
[('amar', 27) ('anil', 25) ('raju', 21) ('ravi', 17)]

numpy.argmax() 和 numpy.argmin()

这两个函数分别沿给定轴返回最大和最小元素的索引。

示例

import numpy as np 
a = np.array([[30,40,70],[80,20,10],[50,90,60]])  
print  '我们的数组是:'  
print a 
print  '\n'  
print  '调用 argmax() 函数:'  
print np.argmax(a)  
print  '\n'  
print  '展开数组:'  
print a.flatten()  
print  '\n'  
print  '沿轴 0 的最大值索引:' 
maxindex = np.argmax(a, axis =  0)  
print maxindex 
print  '\n'  
print  '沿轴 1 的最大值索引:' 
maxindex = np.argmax(a, axis =  1)  
print maxindex 
print  '\n'  
print  '调用 argmin() 函数:' 
minindex = np.argmin(a)  
print minindex 
print  '\n'  
print  '展开数组中的最小值:'  
print a.flatten()[minindex]  
print  '\n'  
print  '沿轴 0 的最小值索引:' 
minindex = np.argmin(a, axis =  0)  
print minindex 
print  '\n'  
print  '沿轴 1 的最小值索引:' 
minindex = np.argmin(a, axis =  1)  
print minindex

  
  
Python

输出如下:

我们的数组是:
[[30 40 70]
 [80 20 10]
 [50 90 60]]

调用 argmax() 函数:
7

展开数组:
[30 40 70 80 20 10 50 90 60]

沿轴 0 的最大值索引:
[1 2 0]

沿轴 1 的最大值索引:
[2 0 1]

调用 argmin() 函数:
5

展开数组中的最小值:
10

沿轴 0 的最小值索引:
[0 1 1]

沿轴 1 的最小值索引:
[0 2 0]

numpy.nonzero()

numpy.nonzero()函数返回输入数组中非零元素的索引。

示例

import numpy as np 
a = np.array([[30,40,0],[0,20,10],[50,0,60]])  
print  '我们的数组是:'  
print a 
print  '\n'  
print  '调用 nonzero() 函数:'  
print np.nonzero (a)

  
  
Python

输出如下:

我们的数组是:
[[30 40 0]
 [ 0 20 10]
 [50 0 60]]

调用 nonzero() 函数:
(array([0, 0, 1, 1, 2, 2]), array([0, 1, 1, 2, 0, 2]))

numpy.where()

where()函数返回输入数组中满足给定条件的元素的索引。

示例

import numpy as np 
x = np.arange(9.).reshape(3,  3)  
print  '我们的数组是:'  
print x 
print  '大于 3 的元素的索引:' 
y = np.where(x >  3)  
print y 
print  '使用这些索引来获取满足条件的元素:'  
print x[y]

  
  
Python

输出如下:

我们的数组是:
[[ 0. 1. 2.]
 [ 3. 4. 5.]
 [ 6. 7. 8.]]

大于 3 的元素的索引:
(array([1, 1, 2, 2, 2]), array([1, 2, 0, 1, 2]))

使用这些索引来获取满足条件的元素:
[ 4. 5. 6. 7. 8.]

numpy.extract()

extract()函数返回满足任何条件的元素。

import numpy as np 
x = np.arange(9.).reshape(3,  3)  
print  '我们的数组是:'  
print x 
# 定义条件 
condition = np.mod(x,2)  ==  0  
print  '按元素的条件值:'  
print condition 
print  '使用条件提取元素:'  
print np.extract(condition, x)

  
  
Python

输出如下:

我们的数组是:
[[ 0. 1. 2.]
 [ 3. 4. 5.]
 [ 6. 7. 8.]]

按元素的条件值:
[[ True False True]
 [False True False]
 [ True False True]]

使用条件提取元素:
[ 0. 2. 4. 6. 8.]

NumPy - 副本和视图

在执行函数时,其中一些返回输入数组的副本,而另一些返回视图。 当内容物理存储在另一个位置时,称为副本。 另一方面,如果提供了相同内存内容的不同视图,我们将其称为视图

无复制

简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。

此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。

示例

import numpy as np 
a = np.arange(6)  
print  '我们的数组是:'  
print a 
print  '调用 id() 函数:'  
print id(a)  
print  'a 赋值给 b:' 
b = a 
print b 
print  'b 拥有相同 id():'  
print id(b)  
print  '修改 b 的形状:' 
b.shape =  3,2  
print b 
print  'a 的形状也修改了:'  
print a

  
  
Python

输出如下:

我们的数组是:
[0 1 2 3 4 5]

调用 id() 函数:
139747815479536

a 赋值给 b:
[0 1 2 3 4 5]
b 拥有相同 id()139747815479536

修改 b 的形状:
[[0 1]
 [2 3]
 [4 5]]

a 的形状也修改了:
[[0 1]
 [2 3]
 [4 5]]

  
  
Python

视图或浅复制

NumPy 拥有ndarray.view()方法,它是一个新的数组对象,并可查看原始数组的相同数据。 与前一种情况不同,新数组的维数更改不会更改原始数据的维数。

示例

import numpy as np 
# 最开始 a 是个 3X2 的数组
a = np.arange(6).reshape(3,2)  
print  '数组 a:'  
print a 
print  '创建 a 的视图:' 
b = a.view()  
print b 
print  '两个数组的 id() 不同:'  
print  'a 的 id():'  
print id(a)  
print  'b 的 id():'  
print id(b)  
# 修改 b 的形状,并不会修改 a
b.shape =  2,3  
print  'b 的形状:'  
print b 
print  'a 的形状:'  
print a

  
  
Python

输出如下:

数组 a:
[[0 1]
 [2 3]
 [4 5]]

创建 a 的视图:
[[0 1]
 [2 3]
 [4 5]]

两个数组的 id() 不同:
a 的 id()140424307227264
b 的 id()140424151696288

b 的形状:
[[0 1 2]
 [3 4 5]]

a 的形状:
[[0 1]
 [2 3]
 [4 5]]

  
  
Python

数组的切片也会创建视图:

示例

import numpy as np 
a = np.array([[10,10],  [2,3],  [4,5]])  
print  '我们的数组:'  
print a 
print  '创建切片:' 
s = a[:,  :2]  
print s

  
  
Python

输出如下:

我们的数组:
[[10 10]
 [ 2 3]
 [ 4 5]]

创建切片:
[[10 10]
 [ 2 3]
 [ 4 5]]

  
  
Python

深复制

ndarray.copy()函数创建一个深层副本。 它是数组及其数据的完整副本,不与原始数组共享。

示例

import numpy as np 
a = np.array([[10,10],  [2,3],  [4,5]])  
print  '数组 a:'  
print a 
print  '创建 a 的深层副本:' 
b = a.copy()  
print  '数组 b:'  
print b 
# b 与 a 不共享任何内容  
print  '我们能够写入 b 来写入 a 吗?'  
print b is a 
print  '修改 b 的内容:' 
b[0,0]  =  100  
print  '修改后的数组 b:'  
print b 
print  'a 保持不变:'  
print a

  
  
Python

输出如下:

数组 a:
[[10 10]
 [ 2 3]
 [ 4 5]]

创建 a 的深层副本:
数组 b:
[[10 10]
 [ 2 3]
 [ 4 5]]
我们能够写入 b 来写入 a 吗?
False

修改 b 的内容:
修改后的数组 b:
[[100 10]
 [ 2 3]
 [ 4 5]]

a 保持不变:
[[10 10]
 [ 2 3]
 [ 4 5]]


NumPy - 线性代数

NumPy 包包含numpy.linalg模块,提供线性代数所需的所有功能。 此模块中的一些重要功能如下表所述。

序号函数及描述
1.dot 两个数组的点积
2.vdot 两个向量的点积
3.inner 两个数组的内积
4.matmul 两个数组的矩阵积
5.determinant 数组的行列式
6.solve 求解线性矩阵方程
7.inv 寻找矩阵的乘法逆矩阵

numpy.dot()

此函数返回两个数组的点积。 对于二维向量,其等效于矩阵乘法。 对于一维数组,它是向量的内积。 对于 N 维数组,它是a的最后一个轴上的和与b的倒数第二个轴的乘积。

import numpy.matlib 
import numpy as np 

a = np.array([[1,2],[3,4]]) 
b = np.array([[11,12],[13,14]]) 
np.dot(a,b)

   
   
Python

输出如下:

[[37  40] 
 [85  92]]

   
   
Python

要注意点积计算为:

[[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]

numpy.vdot()

此函数返回两个向量的点积。 如果第一个参数是复数,那么它的共轭复数会用于计算。 如果参数id是多维数组,它会被展开。

例子

import numpy as np 
a = np.array([[1,2],[3,4]]) 
b = np.array([[11,12],[13,14]]) 
print np.vdot(a,b)

   
   
Python

输出如下:

130

   
   
Python

注意:1*11 + 2*12 + 3*13 + 4*14 = 130

numpy.inner()

此函数返回一维数组的向量内积。 对于更高的维度,它返回最后一个轴上的和的乘积。

例子

import numpy as np 
print np.inner(np.array([1,2,3]),np.array([0,1,0])) 
# 等价于 1*0+2*1+3*0

   
   
Python

输出如下:

2

   
   
Python

例子

# 多维数组示例 
import numpy as np 
a = np.array([[1,2], [3,4]]) 

print '数组 a:' 
print a 
b = np.array([[11, 12], [13, 14]]) 

print '数组 b:' 
print b 

print '内积:' 
print np.inner(a,b)

   
   
Python

输出如下:

数组 a:
[[1 2]
[3 4]]

数组 b:
[[11 12]
[13 14]]

内积:
[[35 41]
[81 95]]

   
   
Python

上面的例子中,内积计算如下:

1*11+2*12, 1*13+2*14 
3*11+4*12, 3*13+4*14

   
   
Python

numpy.matmul

numpy.matmul()函数返回两个数组的矩阵乘积。 虽然它返回二维数组的正常乘积,但如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。

另一方面,如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。

例子

# 对于二维数组,它就是矩阵乘法
import numpy.matlib 
import numpy as np 

a = [[1,0],[0,1]] 
b = [[4,1],[2,2]] 
print np.matmul(a,b)

   
   
Python

输出如下:

[[4  1] 
 [2  2]]

   
   
Python

例子

# 二维和一维运算
import numpy.matlib 
import numpy as np 

a = [[1,0],[0,1]] 
b = [1,2] 
print np.matmul(a,b) 
print np.matmul(b,a)

   
   
Python

输出如下:

[1  2] 
[1  2]

   
   
Python

例子

# 维度大于二的数组 
import numpy.matlib 
import numpy as np 

a = np.arange(8).reshape(2,2,2) 
b = np.arange(4).reshape(2,2) 
print np.matmul(a,b)

   
   
Python

输出如下:

[[[2   3] 
   [6   11]] 
  [[10  19] 
   [14  27]]]

   
   
Python

numpy.linalg.det()

行列式在线性代数中是非常有用的值。 它从方阵的对角元素计算。 对于 2×2 矩阵,它是左上和右下元素的乘积与其他两个的乘积的差。

换句话说,对于矩阵[[a,b],[c,d]],行列式计算为ad-bc。 较大的方阵被认为是 2×2 矩阵的组合。

numpy.linalg.det()函数计算输入矩阵的行列式。

例子

import numpy as np
a = np.array([[1,2], [3,4]]) 
print np.linalg.det(a)

   
   
Python

输出如下:

-2.0

   
   
Python

例子

b = np.array([[6,1,1], [4, -2, 5], [2,8,7]]) 
print b 
print np.linalg.det(b) 
print 6*(-2*7 - 5*8) - 1*(4*7 - 5*2) + 1*(4*8 - -2*2)

   
   
Python

输出如下:

[[ 6 1 1]
 [ 4 -2 5]
 [ 2 8 7]]

-306.0

-306

   
   
Python

numpy.linalg.solve()

numpy.linalg.solve()函数给出了矩阵形式的线性方程的解。

考虑以下线性方程:

x + y + z = 6

2y + 5z = -4

2x + 5y - z = 27

   
   
Python

可以使用矩阵表示为:

如果矩阵成为AXB,方程变为:

AX = B

   
   
Python

X = A^(-1)B

   
   
Python

numpy.linalg.inv()

我们使用numpy.linalg.inv()函数来计算矩阵的逆。 矩阵的逆是这样的,如果它乘以原始矩阵,则得到单位矩阵。

例子

import numpy as np 

x = np.array([[1,2],[3,4]]) 
y = np.linalg.inv(x) 
print x 
print y 
print np.dot(x,y)

   
   
Python

输出如下:

[[1 2]                                                                        
 [3 4]]                                                                       
[[-2.   1. ]                                                                  
 [ 1.5 -0.5]]                                                                 
[[  1.00000000e+00   1.11022302e-16]                                          
 [  0.00000000e+00   1.00000000e+00]]

   
   
Python

例子

现在让我们在示例中创建一个矩阵A的逆。

import numpy as np 
a = np.array([[1,1,1],[0,2,5],[2,5,-1]]) 

print '数组 a:'
print a 
ainv = np.linalg.inv(a) 

print 'a 的逆:' 
print ainv  

print '矩阵 b:' 
b = np.array([[6],[-4],[27]]) 
print b 

print '计算:A^(-1)B:' 
x = np.linalg.solve(a,b) 
print x  
# 这就是线性方向 x = 5, y = 3, z = -2 的解

   
   
Python

输出如下:

数组 a:
[[ 1 1 1]
 [ 0 2 5]
 [ 2 5 -1]]

a 的逆:
[[ 1.28571429 -0.28571429 -0.14285714]
 [-0.47619048 0.14285714 0.23809524]
 [ 0.19047619 0.14285714 -0.0952381 ]]

矩阵 b:
[[ 6]
 [-4]
 [27]]

计算:A^(-1)B:
[[ 5.]
 [ 3.]
 [-2.]]

   
   
Python

结果也可以使用下列函数获取

x = np.dot(ainv,b)

   
   

NumPy - 线性代数

NumPy 包包含numpy.linalg模块,提供线性代数所需的所有功能。 此模块中的一些重要功能如下表所述。

序号函数及描述
1.dot 两个数组的点积
2.vdot 两个向量的点积
3.inner 两个数组的内积
4.matmul 两个数组的矩阵积
5.determinant 数组的行列式
6.solve 求解线性矩阵方程
7.inv 寻找矩阵的乘法逆矩阵

numpy.dot()

此函数返回两个数组的点积。 对于二维向量,其等效于矩阵乘法。 对于一维数组,它是向量的内积。 对于 N 维数组,它是a的最后一个轴上的和与b的倒数第二个轴的乘积。

import numpy.matlib 
import numpy as np 

a = np.array([[1,2],[3,4]]) 
b = np.array([[11,12],[13,14]]) 
np.dot(a,b)

     
     
Python

输出如下:

[[37  40] 
 [85  92]]

      
      
Python

要注意点积计算为:

[[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]

numpy.vdot()

此函数返回两个向量的点积。 如果第一个参数是复数,那么它的共轭复数会用于计算。 如果参数id是多维数组,它会被展开。

例子

import numpy as np 
a = np.array([[1,2],[3,4]]) 
b = np.array([[11,12],[13,14]]) 
print np.vdot(a,b)

      
      
Python

输出如下:

130

      
      
Python

注意:1*11 + 2*12 + 3*13 + 4*14 = 130

numpy.inner()

此函数返回一维数组的向量内积。 对于更高的维度,它返回最后一个轴上的和的乘积。

例子

import numpy as np 
print np.inner(np.array([1,2,3]),np.array([0,1,0])) 
# 等价于 1*0+2*1+3*0

      
      
Python

输出如下:

2

      
      
Python

例子

# 多维数组示例 
import numpy as np 
a = np.array([[1,2], [3,4]]) 

print '数组 a:' 
print a 
b = np.array([[11, 12], [13, 14]]) 

print '数组 b:' 
print b 

print '内积:' 
print np.inner(a,b)

      
      
Python

输出如下:

数组 a:
[[1 2]
[3 4]]

数组 b:
[[11 12]
[13 14]]

内积:
[[35 41]
[81 95]]

      
      
Python

上面的例子中,内积计算如下:

1*11+2*12, 1*13+2*14 
3*11+4*12, 3*13+4*14

      
      
Python

numpy.matmul

numpy.matmul()函数返回两个数组的矩阵乘积。 虽然它返回二维数组的正常乘积,但如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。

另一方面,如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。

例子

# 对于二维数组,它就是矩阵乘法
import numpy.matlib 
import numpy as np 

a = [[1,0],[0,1]] 
b = [[4,1],[2,2]] 
print np.matmul(a,b)

      
      
Python

输出如下:

[[4  1] 
 [2  2]]

      
      
Python

例子

# 二维和一维运算
import numpy.matlib 
import numpy as np 

a = [[1,0],[0,1]] 
b = [1,2] 
print np.matmul(a,b) 
print np.matmul(b,a)

      
      
Python

输出如下:

[1  2] 
[1  2]

      
      
Python

例子

# 维度大于二的数组 
import numpy.matlib 
import numpy as np 

a = np.arange(8).reshape(2,2,2) 
b = np.arange(4).reshape(2,2) 
print np.matmul(a,b)

      
      
Python

输出如下:

[[[2   3] 
   [6   11]] 
  [[10  19] 
   [14  27]]]

      
      
Python

numpy.linalg.det()

行列式在线性代数中是非常有用的值。 它从方阵的对角元素计算。 对于 2×2 矩阵,它是左上和右下元素的乘积与其他两个的乘积的差。

换句话说,对于矩阵[[a,b],[c,d]],行列式计算为ad-bc。 较大的方阵被认为是 2×2 矩阵的组合。

numpy.linalg.det()函数计算输入矩阵的行列式。

例子

import numpy as np
a = np.array([[1,2], [3,4]]) 
print np.linalg.det(a)

      
      
Python

输出如下:

-2.0

      
      
Python

例子

b = np.array([[6,1,1], [4, -2, 5], [2,8,7]]) 
print b 
print np.linalg.det(b) 
print 6*(-2*7 - 5*8) - 1*(4*7 - 5*2) + 1*(4*8 - -2*2)

      
      
Python

输出如下:

[[ 6 1 1]
 [ 4 -2 5]
 [ 2 8 7]]

-306.0

-306

      
      
Python

numpy.linalg.solve()

numpy.linalg.solve()函数给出了矩阵形式的线性方程的解。

考虑以下线性方程:

x + y + z = 6

2y + 5z = -4

2x + 5y - z = 27

      
      
Python

可以使用矩阵表示为:

如果矩阵成为AXB,方程变为:

AX = B

      
      
Python

X = A^(-1)B

      
      
Python

numpy.linalg.inv()

我们使用numpy.linalg.inv()函数来计算矩阵的逆。 矩阵的逆是这样的,如果它乘以原始矩阵,则得到单位矩阵。

例子

import numpy as np 

x = np.array([[1,2],[3,4]]) 
y = np.linalg.inv(x) 
print x 
print y 
print np.dot(x,y)

      
      
Python

输出如下:

[[1 2]                                                                        
 [3 4]]                                                                       
[[-2.   1. ]                                                                  
 [ 1.5 -0.5]]                                                                 
[[  1.00000000e+00   1.11022302e-16]                                          
 [  0.00000000e+00   1.00000000e+00]]

      
      
Python

例子

现在让我们在示例中创建一个矩阵A的逆。

import numpy as np 
a = np.array([[1,1,1],[0,2,5],[2,5,-1]]) 

print '数组 a:'
print a 
ainv = np.linalg.inv(a) 

print 'a 的逆:' 
print ainv  

print '矩阵 b:' 
b = np.array([[6],[-4],[27]]) 
print b 

print '计算:A^(-1)B:' 
x = np.linalg.solve(a,b) 
print x  
# 这就是线性方向 x = 5, y = 3, z = -2 的解

      
      
Python

输出如下:

数组 a:
[[ 1 1 1]
 [ 0 2 5]
 [ 2 5 -1]]

a 的逆:
[[ 1.28571429 -0.28571429 -0.14285714]
 [-0.47619048 0.14285714 0.23809524]
 [ 0.19047619 0.14285714 -0.0952381 ]]

矩阵 b:
[[ 6]
 [-4]
 [27]]

计算:A^(-1)B:
[[ 5.]
 [ 3.]
 [-2.]]

      
      
Python

结果也可以使用下列函数获取

x = np.dot(ainv,b)

NumPy - IO

ndarray对象可以保存到磁盘文件并从磁盘文件加载。 可用的 IO 功能有:

  • load()save()函数处理 numPy 二进制文件(带npy扩展名)

  • loadtxt()savetxt()函数处理正常的文本文件

NumPy 为ndarray对象引入了一个简单的文件格式。 这个npy文件在磁盘文件中,存储重建ndarray所需的数据、图形、dtype和其他信息,以便正确获取数组,即使该文件在具有不同架构的另一台机器上。

numpy.save()

numpy.save()文件将输入数组存储在具有npy扩展名的磁盘文件中。

import numpy as np 
a = np.array([1,2,3,4,5]) 
np.save('outfile',a)

    
    
Python

为了从outfile.npy重建数组,请使用load()函数。

import numpy as np 
b = np.load('outfile.npy')  
print b

    
    
Python

输出如下:

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

    
    
Python

save()load()函数接受一个附加的布尔参数allow_pickles。 Python 中的pickle用于在保存到磁盘文件或从磁盘文件读取之前,对对象进行序列化和反序列化。

savetxt()

以简单文本文件格式存储和获取数组数据,是通过savetxt()loadtx()函数完成的。

示例

import numpy as np 

a = np.array([1,2,3,4,5]) 
np.savetxt('out.txt',a) 
b = np.loadtxt('out.txt')  
print b

    
    
Python

输出如下:

[ 1.  2.  3.  4.  5.]

    
    
Python

savetxt()loadtxt()数接受附加的可选参数,例如页首,页尾和分隔符。



NumPy - 线性代数

NumPy 包包含numpy.linalg模块,提供线性代数所需的所有功能。 此模块中的一些重要功能如下表所述。

序号函数及描述
1.dot 两个数组的点积
2.vdot 两个向量的点积
3.inner 两个数组的内积
4.matmul 两个数组的矩阵积
5.determinant 数组的行列式
6.solve 求解线性矩阵方程
7.inv 寻找矩阵的乘法逆矩阵

numpy.dot()

此函数返回两个数组的点积。 对于二维向量,其等效于矩阵乘法。 对于一维数组,它是向量的内积。 对于 N 维数组,它是a的最后一个轴上的和与b的倒数第二个轴的乘积。

import numpy.matlib 
import numpy as np 

a = np.array([[1,2],[3,4]]) 
b = np.array([[11,12],[13,14]]) 
np.dot(a,b)

    
    
Python

输出如下:

[[37  40] 
 [85  92]]

    
    
Python

要注意点积计算为:

[[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]

numpy.vdot()

此函数返回两个向量的点积。 如果第一个参数是复数,那么它的共轭复数会用于计算。 如果参数id是多维数组,它会被展开。

例子

import numpy as np 
a = np.array([[1,2],[3,4]]) 
b = np.array([[11,12],[13,14]]) 
print np.vdot(a,b)

    
    
Python

输出如下:

130

    
    
Python

注意:1*11 + 2*12 + 3*13 + 4*14 = 130

numpy.inner()

此函数返回一维数组的向量内积。 对于更高的维度,它返回最后一个轴上的和的乘积。

例子

import numpy as np 
print np.inner(np.array([1,2,3]),np.array([0,1,0])) 
# 等价于 1*0+2*1+3*0

    
    
Python

输出如下:

2

    
    
Python

例子

# 多维数组示例 
import numpy as np 
a = np.array([[1,2], [3,4]]) 

print '数组 a:' 
print a 
b = np.array([[11, 12], [13, 14]]) 

print '数组 b:' 
print b 

print '内积:' 
print np.inner(a,b)

    
    
Python

输出如下:

数组 a:
[[1 2]
[3 4]]

数组 b:
[[11 12]
[13 14]]

内积:
[[35 41]
[81 95]]

    
    
Python

上面的例子中,内积计算如下:

1*11+2*12, 1*13+2*14 
3*11+4*12, 3*13+4*14

    
    
Python

numpy.matmul

numpy.matmul()函数返回两个数组的矩阵乘积。 虽然它返回二维数组的正常乘积,但如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。

另一方面,如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。

例子

# 对于二维数组,它就是矩阵乘法
import numpy.matlib 
import numpy as np 

a = [[1,0],[0,1]] 
b = [[4,1],[2,2]] 
print np.matmul(a,b)

    
    
Python

输出如下:

[[4  1] 
 [2  2]]

    
    
Python

例子

# 二维和一维运算
import numpy.matlib 
import numpy as np 

a = [[1,0],[0,1]] 
b = [1,2] 
print np.matmul(a,b) 
print np.matmul(b,a)

    
    
Python

输出如下:

[1  2] 
[1  2]

    
    
Python

例子

# 维度大于二的数组 
import numpy.matlib 
import numpy as np 

a = np.arange(8).reshape(2,2,2) 
b = np.arange(4).reshape(2,2) 
print np.matmul(a,b)

    
    
Python

输出如下:

[[[2   3] 
   [6   11]] 
  [[10  19] 
   [14  27]]]

    
    
Python

numpy.linalg.det()

行列式在线性代数中是非常有用的值。 它从方阵的对角元素计算。 对于 2×2 矩阵,它是左上和右下元素的乘积与其他两个的乘积的差。

换句话说,对于矩阵[[a,b],[c,d]],行列式计算为ad-bc。 较大的方阵被认为是 2×2 矩阵的组合。

numpy.linalg.det()函数计算输入矩阵的行列式。

例子

import numpy as np
a = np.array([[1,2], [3,4]]) 
print np.linalg.det(a)

    
    
Python

输出如下:

-2.0

    
    
Python

例子

b = np.array([[6,1,1], [4, -2, 5], [2,8,7]]) 
print b 
print np.linalg.det(b) 
print 6*(-2*7 - 5*8) - 1*(4*7 - 5*2) + 1*(4*8 - -2*2)

    
    
Python

输出如下:

[[ 6 1 1]
 [ 4 -2 5]
 [ 2 8 7]]

-306.0

-306

    
    
Python

numpy.linalg.solve()

numpy.linalg.solve()函数给出了矩阵形式的线性方程的解。

考虑以下线性方程:

x + y + z = 6

2y + 5z = -4

2x + 5y - z = 27

    
    
Python

可以使用矩阵表示为:

如果矩阵成为AXB,方程变为:

AX = B

    
    
Python

X = A^(-1)B

    
    
Python

numpy.linalg.inv()

我们使用numpy.linalg.inv()函数来计算矩阵的逆。 矩阵的逆是这样的,如果它乘以原始矩阵,则得到单位矩阵。

例子

import numpy as np 

x = np.array([[1,2],[3,4]]) 
y = np.linalg.inv(x) 
print x 
print y 
print np.dot(x,y)

    
    
Python

输出如下:

[[1 2]                                                                        
 [3 4]]                                                                       
[[-2.   1. ]                                                                  
 [ 1.5 -0.5]]                                                                 
[[  1.00000000e+00   1.11022302e-16]                                          
 [  0.00000000e+00   1.00000000e+00]]

    
    
Python

例子

现在让我们在示例中创建一个矩阵A的逆。

import numpy as np 
a = np.array([[1,1,1],[0,2,5],[2,5,-1]]) 

print '数组 a:'
print a 
ainv = np.linalg.inv(a) 

print 'a 的逆:' 
print ainv  

print '矩阵 b:' 
b = np.array([[6],[-4],[27]]) 
print b 

print '计算:A^(-1)B:' 
x = np.linalg.solve(a,b) 
print x  
# 这就是线性方向 x = 5, y = 3, z = -2 的解

    
    
Python

输出如下:

数组 a:
[[ 1 1 1]
 [ 0 2 5]
 [ 2 5 -1]]

a 的逆:
[[ 1.28571429 -0.28571429 -0.14285714]
 [-0.47619048 0.14285714 0.23809524]
 [ 0.19047619 0.14285714 -0.0952381 ]]

矩阵 b:
[[ 6]
 [-4]
 [27]]

计算:A^(-1)B:
[[ 5.]
 [ 3.]
 [-2.]]

    
    
Python

结果也可以使用下列函数获取

x = np.dot(ainv,b)
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值