Numpy

Numpy 属性

  • ndim:维度
  • shape:行数和列数
  • size:元素个数
import numpy as np
# 定义数组
array = np.array([[1,2,3],[2,3,4]])
print(array)
# ndim 维度的数量
print('维度的数量',array.ndim)
# 维度
print('维度',array.shape)
# 数组元素的个数
print('数组元素的个数',array.size)
# 对象元素的类型
print('对象元素的类型',array.dtype)
# 对象每个元素的大小、以字节为单位
print('对象每个元素的大小、以字节为单位',array.itemsize)
# 对象内存信息
print(' 对象内存信息',array.flags)

axis=0 与 axis=1 的区分

就是0轴匹配的是index, 涉及上下运算;1轴匹配的是columns, 涉及左右运算。
 

amin(a,0) 是延着 axis=0 轴的最小值,axis=0是把元素看成[1,2,3],[4,5,6],[7,8,9]三个元素,所以最小值是[1,2,3],

amin(a,1) 是延着 axis=1 轴的最小值,axis=1 轴是把元素看成了 [1,4,7],[2,5,8], [3,6,9] 三个元素,所以最小值为 [1,4,7]。

a = np.array([[1,2,3], [4,5,6],[7,8,9]])
print('a=',a,'
')
print('a[1]:',a[1])
print(np.amin(a))
print(np.amin(a,0))
print(np.amin(a,1))
print(np.amax(a))
print(np.amax(a,0))
print(np.amax(a,1))

a= [[1 2 3]
 [4 5 6]
 [7 8 9]] 

a[1]: [4 5 6]
1
[1 2 3]
[1 4 7]
9
[7 8 9]
[3 6 9]

 创建数组

关键字 
array:创建数组
dtype:指定数据类型
zeros:创建数据全为0
ones:创建数据全为1
empty:创建数据接近0
arange:按指定范围创建数据
linspace:创建线段

具体代码:

# 创建数组
import numpy as np
a = np.array([1,2,3])
print(a)

[1 2 3]

# 指定数组类型 指定数据 dtype
a = np.array([1,2,3],dtype=np.float32)
print(a)

a2 = np.array([1,2,3],dtype=np.int32)
print(a2)

[1. 2. 3.]
[1 2 3]


# 创建特定数据
# 2行3列
a = np.array([[1,2,3],[3,2,1]])
print(a)
print(a.shape)
print(a.dtype)

[[1 2 3]
 [3 2 1]]
(2, 3)
int32

# 创建全零数组
# 数据全为0,3行4列 
# 默认为float
a = np.zeros((3,4))
print(a)
print(a.dtype)
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
float64


# 创建全为1的数组, 同时也能指定这些特定数据的 dtype:
a = np.ones((3,4),dtype=np.int)
print(a)
print(a.dtype)
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]
int32

# 创建全空数组, 其实每个值都是接近于零的数:
a = np.empty((3,4))
print(a)
print(a.dtype)

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
float64

# 用 arange 创建连续数组:
# 10-19 的数据,2步长  arange用来创建数组
a = np.arange(10,20,2)
print(a)
print(a.dtype)

[10 12 14 16 18]
int32


# 使用 reshape 改变数据的形状
# 3行4列 ,0到11
a = np.arange(12).reshape((3,4))
print(a)
print(a.dtype)


[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
int32


# 用 linspace 创建线段型数据:
# 开始端为1 ,结束端10,且分割成20个数据,生成线段
a = np.linspace(1,10,20)
print(a)
print(a.dtype)

# 同样也能进行 reshape 工作:
a2 = np.linspace(1,10,20).reshape((4,5))
print('------------------------------------------------------------------')
print(a2)
print(a2.dtype)


[ 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.        ]
float64
------------------------------------------------------------------
[[ 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.        ]]
float64

NumPy 从已有的数组创建数组


numpy.asarray(a, dtype = None, order = None)
a        任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组
dtype    数据类型,可选
order    可选,有"C""F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合

实例
将列表转换为 ndarray:
import numpy as np 
x =  [1,2,3] 
a = np.asarray(x)
print(a,type(a),a.dtype)

[1 2 3] <class 'numpy.ndarray'> int32

将元组转换为 ndarray:

 将元组列表转换为 ndarray:

 设置了 dtype 参数:数据类型

NumPy 从数值范围创建数组

numpy.arange
numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:

numpy.arange(start, stop, step, dtype)

import numpy as np

x = np.arange(0,5,2,float)
print(x)

[0. 2. 4.]

numpy.linspace

numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

numpy.logspace

numpy.logspace 函数用于创建一个于等比数列。格式如下:

np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

 切片

# 切片 顾头不顾尾,指的索引
a = np.array(range(10))
print(a)
# # 从索引 0 开始到索引 10 停止,不包括10,间隔为 2
print(a[0:10:2])

[0 1 2 3 4 5 6 7 8 9]
[0 2 4 6 8]

多维数组同样适用上述索引提取方法:

多维数组是对行的切片

# 多维数组同样适用上述索引提取方法:
b = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(b[0])
print(b[1:])

[1 2 3]

[[4 5 6]
 [7 8 9]]

b = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(b[1:3])查询第二行到第三行的数组

[[4 5 6]
[7 8 9]]

切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。

a = np.array([[1, 2, 3], [3, 4, 5], [6, 7, 8]])
print(a[..., 1])  # 第2列元素
print()
print(a[1, ...])  # 第2行元素
print()
print(a[..., 1:])  # 第2列及剩下的所有元素

[2 4 7]

[3 4 5]

[[2 3]
 [4 5]
 [7 8]]

NumPy 高级索引

整数数组索引

# 以下实例获取数组中(0,0),(1,1)和(2,0)位置处的元素。
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0, 1, 2], [0, 1, 0]]
print('x:',x)
print('y:',y)

x: [[1 2]
    [3 4]
    [5 6]]

y: [1 4 5]

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

组合:(0,0),(1,1)和(2,0)

NumPy 高级索引

#以下实例获取了 4X3 数组中的四个角的元素。
# 行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2]。

x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('我们的数组是:')
print(x)
print('
')
rows = np.array([[0, 0], [3, 3]])
print(rows,'
')
cols = np.array([[0, 2], [0, 2]])
print(cols,'
')

y = x[[0, 0, 3, 3],[0, 2,0, 2]]
y2 = x[rows, cols]
print('这个数组的四个角元素是:')
print(y)
print(y2)

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


[[0 0]
[3 3]]

[[0 2]
[0 2]]

这个数组的四个角元素是:
[ 0 2 9 11]


[[ 0 2]
[ 9 11]]

----------------------------------------------

[0, 0, 3, 3]
[0, 2,0, 2]

行和列:(0,0),(0,2),(3,0),(3,2)

Numpy 数组操作

Numpy 中包含了一些函数用于处理数组,大概可分为以下几类:

修改数组形状
翻转数组
修改数组维度
连接数组
分割数组
数组元素的添加与删除

索引

import numpy as np
A = np.arange(3,15)
print(A)
print(A[3])

[ 3  4  5  6  7  8  9 10 11 12 13 14]
6

# 让我们将矩阵转换为二维的,此时进行同样的操作:
A = np.arange(3,15).reshape((3,4))
print(A[2])

[11 12 13 14]

# 二维索引
print(A[1][1]) 
8
# 在Python的 list 中,我们可以利用:对一定范围内的元素进行切片操作,
# 在Numpy中我们依然可以给出相应的方法:
print(A[1, 1:3])  
[8 9]
# 用for循环进行打印
# 逐行进行打印
for row in A:
    print(row)
[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]

# 逐列打印,就需要稍稍变化一下
for column in A.T:
    print(column)
[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]

#  flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列

#  而flat是一个迭代器,本身是一个object属性。
import numpy as np
A = np.arange(3,15).reshape((3,4))
print(A.flatten())  
[ 3  4  5  6  7  8  9 10 11 12 13 14]
for item in A.flat:
    print(item)
3
4
5
6
7
8
9
10
11
12
13
14

Numpy array合并

# Numpy array合并
np.vstack()
np.hstack()
np.newaxis()
np.concatenate()

# vertical stack本身属于一种上下合并,即对括号中的两个整体进行对应操作
import numpy as np
A = np.array([1,2,3])
B = np.array([4,5,6])
print(np.vstack((A,B)))
[[1 2 3]
 [4 5 6]]
C = np.vstack((A,B))   
# 数组的维度,几行几列
# A仅仅是一个拥有3项元素的数组(数列),而合并后得到的C是一个2行3列的矩阵。
print(A.shape,C.shape)
(3,) (2, 3)
# 左右合并

D = np.hstack((A,B))       # horizontal stack
print(D)
print(A.shape,D.shape)
[1 2 3 4 5 6]
(3,) (6,)

# 转置操作
# 具有3个元素的array转换为了1行3列以及3行1列的矩阵了。
print(A[np.newaxis,:])# 横着的
print('--------------')
print(A[:,np.newaxis])# 竖着的
[[1 2 3]]
--------------
[[1]
 [2]
 [3]]

import numpy as np
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(D)

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

# axis参数很好的控制了矩阵的纵向或是横向打印,相比较vstack和hstack函数显得更加方便。

# 多个array 的纵向或者横向合并
A = np.array([1,1,1])[:,np.newaxis]# 竖着的
B = np.array([2,2,2])[:,np.newaxis]# 竖着的
C = np.concatenate((A,B,B,A),axis=0) # axis=0 上下合并

print(C)
print('维度',C.shape)

[[1]
 [1]
 [1]
 [2]
 [2]
 [2]
 [2]
 [2]
 [2]
 [1]
 [1]
 [1]]
维度 (12, 1)

D = np.concatenate((A,B,B,A),axis=1) # 左右合并
print(D)
print('维度',D.shape)
[[1 2 2 1]
 [1 2 2 1]
 [1 2 2 1]]
维度 (3, 4)

Numpy array分割

Numpy array 分割
import numpy as np
A = np.arange(12).reshape((3, 4))
print(A)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

# 纵向分割
# 参数介绍  split(数组,分割多少片段,分割方向)
print(np.split(A, 2, axis=1))# 垂直方向
[array([[0, 1],[4, 5],[8, 9]]), 
array([[ 2,  3],[ 6,  7],[10, 11]])]
# 横向分割
print(np.split(A, 3, axis=0))# 水平方向
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
# 错误的分割
#print(np.split(A, 3, axis=1))
# 不等量的分割 

# 在机器学习时经常会需要将数据做不等量的分割,因此解决办法为np.array_split()

print(np.array_split(A, 3, axis=1))
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2],
       [ 6],
       [10]]), array([[ 3],
       [ 7],
       [11]])]
# 在Numpy里还有np.vsplit()与横np.hsplit()方式可用。

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

print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1))

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

Numpy copy & deep copy

Numpy copy & deep copy

1、copy 有关联性
# = 的赋值方式会带有关联性
import numpy as np
a = np.arange(4)
print(a)
b = a
c = a
d = b

# 改变a的第一个值,b、c、d的第一个值也会同时改变。
a[0] = 11
print('a',a)

# 确认b、c、d是否与a相同。
print('b',b)
print('c',c)
print('d',d)

[0 1 2 3]
a [11  1  2  3]
b [11  1  2  3]
c [11  1  2  3]
d [11  1  2  3]

# 同样更改d的值,a、b、c也会改变。
d[1:3] = [22, 33]   # array([11, 22, 33,  3])
print('d',b)
print('a',a)
print('c',c)
print('d',d)
d [11 22 33  3]
a [11 22 33  3]
c [11 22 33  3]
d [11 22 33  3]


2、deep copy没有关联性
# copy() 的赋值方式没有关联性 
b = a.copy()    # deep copy
print('b',b)        
a[3] = 44
print('a',a)        
print('b',b) 
   
b [11 22 33  3]
a [11 22 33 44]
b [11 22 33  3]

 例题

统计全班的成绩

假设一个团队里有 5 名学员,成绩如下表所示。你可以用 NumPy 统计下这些人在语文、
英语、数学中的平均成绩、最小成绩、最大成绩、方差、标准差。然后把这些人的总成绩
排序,得出名次进行成绩输出。

# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
persontype=np.dtype([('name','S20'),('chinese','i'),('english','i'),('math','i')])

peoples = np.array([("zhangfei",66,85,30),("guanyu",95,85,98),
("zhaoyun",93,92,96),("huangzhong",90,88,77),("dainwei",80,90,90)],
dtype=persontype)
print(peoples)

name = peoples['name']
chinese = peoples['chinese']
english = peoples['english']
math = peoples['math']
print(chinese[0],type(chinese[0]))
# 语文、英语、数学中的平均成绩、最小成绩、最大成绩、方差、标准差。然后把这些人的总成绩
# 排序,得出名次进行成绩输出。
print(f"""
语文:
    平均成绩:{np.mean(chinese)}
    最小成绩:{np.amin(chinese)}
    最大成绩:{np.amax(chinese)}
    方差:{np.var(chinese)}
    标准差:{np.std(chinese)}
""")

print(f"""
英语:
    平均成绩:{np.mean(english)}
    最小成绩:{np.amin(english)}
    最大成绩:{np.amax(english)}
    方差:{np.var(english)}
    标准差:{np.std(english)}
""")
print(f"""
数学:
    平均成绩:{np.mean(math)}
    最小成绩:{np.amin(math)}
    最大成绩:{np.amax(math)}
    方差:{np.var(math)}
    标准差:{np.std(math)}
""")
s1 = chinese[0]+english[0]+math[0]
s2 = chinese[1]+english[1]+math[1]
s3 = chinese[2]+english[2]+math[2]
s4 = chinese[3]+english[3]+math[3]
s5 = chinese[4]+english[4]+math[4]
print(s1,type(s1))

atype=([('name','S20'),('sum','i')])

a=np.array([(peoples['name'][0],s1)
            ,(peoples['name'][1],s2)
            ,(peoples['name'][2],s3)
            ,(peoples['name'][3],s4)
            ,(peoples['name'][4],s5)]
           ,dtype=atype)
print(np.sort(a['sum']))
----------------------------------------------------------
[(b'zhangfei', 66, 85, 30) (b'guanyu', 95, 85, 98)
 (b'zhaoyun', 93, 92, 96) (b'huangzhong', 90, 88, 77)
 (b'dainwei', 80, 90, 90)]
66 <class 'numpy.int32'>

语文:
    平均成绩:84.8
    最小成绩:66
    最大成绩:95
    方差:114.96000000000001
    标准差:10.721940122944169


英语:
    平均成绩:88.0
    最小成绩:85
    最大成绩:92
    方差:7.6
    标准差:2.756809750418044


数学:
    平均成绩:78.2
    最小成绩:30
    最大成绩:98
    方差:634.56
    标准差:25.19047439013406

181 <class 'numpy.int32'>
[181 255 260 278 281]

 解决字符串的问题

import numpy as np
new_type = np.dtype([('name', np.str_, 16), ('chinese', np.int32), ('english', np.int32),
('math', np.int32)])

peoples = np.array([("姓名",66,85,30),("张三",95,85,98),
("得到",93,92,96),("王子",90,88,77),("随风倒",80,90,90)],
dtype=new_type)
print(peoples)
------------------------------------------------------------------
[('姓名', 66, 85, 30) ('张三', 95, 85, 98) ('得到', 93, 92, 96)
 ('王子', 90, 88, 77) ('随风倒', 80, 90, 90)]
原文地址:https://www.cnblogs.com/foremostxl/p/10346220.html