科学计算库Numpy基础操作

pycharm,python3.7,numpy版本1.15.1

2018年9月11日04:23:06

"""
    科学计算库Numpy基础操作
    时间:2018\9\11 0011
"""
import numpy

print("""\n------以矩阵的方式读取数据------\n
------------genfromtxt函数('文件路径',delimiter = '分隔符',dtype = 读取方式)---------------------""")
"""
    numpy.ndarray可以当做一个矩阵
"""
np_test = numpy.genfromtxt('Numpy_test.txt', delimiter = ',', dtype = str)  # 通常以str方式读取,如果有float,再进行转换
print(type(np_test))
print(np_test)
# print(help(numpy.genfromtxt))  # 打印帮助文档


print("""\n------numpy.array------\n
------------numpy中最核心的结构------------------------------------------""")
# 传入list结构,转换为ndarray格式
vector = numpy.array([5, 10, 15, 20])  # 创造一维矩阵
matrix = numpy.array([
    [5, 10, 15],
    [20, 25, 30],
    [35, 40, 45]
])  # 创造二维矩阵
print(vector)
print(matrix)

print("""\n------print(numpy对象.shape)------\n
------------打印矩阵结构(例如2×3,3×3之类)------------------------------------------""")
vector = numpy.array([1, 2, 3, 4])
print(vector.shape)
matrix = numpy.array([
    [1, 2, 3],
    [4, 5, 6]
])
print(matrix.shape)

print("""\n------numpy.array结构------\n
------------内部结构必须相同------------------------------------------""")
numbers = numpy.array([1, 2, 3, 4])
print(numbers)
print(numbers.dtype)
numbers = numpy.array([1, 2, 3, 4.0])
print(numbers)
print(numbers.dtype)
numbers = numpy.array([1, 2, 3, '4'])
print(numbers)
print(numbers.dtype)

print("""\n------数据选取------\n
------------与python一样,通过索引读取数据------------------------------------------""")
data_test = numpy.genfromtxt('Numpy_test.txt', delimiter = ',', dtype = str)
print(data_test)
# 读取hanmeimei的国家
hmm_contry = data_test[2, 3]
print("hanmeimei的国家是:{0}".format(hmm_contry))

print("""\n------切片选取------\n
------------与python一样,(起始值:终止值:步长)------------------------------------------""")
vector = numpy.array([5, 10, 15, 20])
print(vector[0:3])  # 左闭右开的区间
matrix = numpy.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])
print(matrix[:, 1])  # 取中间一列也就是每一行,第二个值
print(matrix[:, 0:2])  # 取头两列也就是每一行,第一到第二个值(0:1左开右闭,所以要写0:2)

print("""\n------numpy判断------\n
------------判断某个元素是否在矩阵当中------------------------------------------""")
vector = numpy.array([5, 10, 15, 20])
matrix = numpy.array([
    [5, 10, 15],
    [20, 25, 30],
    [35, 40, 45]
])
print(vector == 10)
print(matrix == 10)
equal_to_ten = vector == 10  # 返回bool类型的值
print(vector[equal_to_ten])  # 当做索引
second_column_25 = (matrix[:, 1] == 25)  # 判断第二列是否有25的值
print(second_column_25)  # 对应每一行False  True False
print(matrix[second_column_25])
equal_to_ten_and_five = (vector == 10) & (vector == 5)  # 是同时否存在10和5,与操作
print(equal_to_ten_and_five)
equal_to_ten_or_five = (vector == 10) | (vector == 5)  # 是否存在10或5,或操作
print(equal_to_ten_or_five)
print(vector[equal_to_ten_or_five])

print("""\n------numpy.array类型的改变------\n
------------astype()函数,数据类型转换------------------------------------------""")
vector = numpy.array(['1', '2', '3'])
print(vector.dtype)
print(vector)
vector = vector.astype(float)
print(vector.dtype)
print(vector)

print("""\n------numpy.array求极值的操作------\n
------------min(),max()函数------------------------------------------""")
vector = numpy.array([5, 10, 15, 20])
print(vector.min())
print(vector.max())

print("""\n------numpy.array按行求和,按列求和------\n
---------sum()方法---参数axis = 1按行,axis = 0按列------------------------------------------""")
matrix = numpy.array([
    [5, 10, 15],
    [20, 25, 30],
    [35, 40, 45]
])
print(matrix.sum(axis = 1))  # 按行求和
print(matrix.sum(axis = 0))  # 按列求和

print("""\n------矩阵变换------\n
---------造矩阵:arange();矩阵变换:reshape()------------------------------------------""")
print(numpy.arange(15))
a = numpy.arange(15).reshape(3, 5)  # 3行5列
print(a)
print(a.shape)  # 矩阵a的行列
print(a.ndim)  # 维度
print(a.dtype)  # 数据类型
print(a.size)  # 元素个数

print("""\n------初始化矩阵------\n
---------造0矩阵:zeros((元组表示矩阵行列))方法,创造1矩阵ones()方法------------------------------------------""")
zero_matrix = numpy.zeros((3, 5))
print(zero_matrix)
one_matrix = numpy.ones((2, 3, 4), dtype = numpy.int32)
print(one_matrix)

print("""\n------序列矩阵------\n
---------aragne()方法------------------------------------------""")
sq_matrix = numpy.arange(10, 30, 5)  # 从10开始,不包括30,步长为5
print(sq_matrix)

print("""\n------随机模块------\n
---------random((元组表示矩阵行列))方法------------------------------------------""")
ran = 10 * numpy.random.random((2, 3))
ran = ran.astype(numpy.int32)
print(ran)

print("""\n------平均间隔矩阵------\n
---------linspase(起始值,最大值,个数)方法------------------------------------------""")
lins = numpy.linspace(0, 1.1, 20)
print(lins)

print("""\n------向量运算------\n
---------加减乘方------------------------------------------""")
a = numpy.array([20, 30, 40, 50])
b = numpy.arange(4)
print(a)
print(b)
c = a - b
print(c)
c = c - 1
print(c)
print(b ** 2)  # 每一个值分别运算
print(a < 35)

print("""\n------矩阵乘法------\n
---------对应位置乘法和点乘------------------------------------------""")
A = numpy.array([
    [1, 1],
    [0, 1]
])
B = numpy.array([
    [2, 0],
    [3, 4]
])
print('A矩阵:\n{0}'.format(A))
print('B矩阵:\n{0}'.format(B))
print('A*B对应位置相乘:\n{0}'.format(A * B))
print('A·B点乘:\n{0}'.format(A.dot(B)))
print('A·B点乘:\n{0}'.format(numpy.dot(A, B)))

print("""\n------矩阵科学计算------\n
---------e的幂,平方根------------------------------------------""")
B = numpy.arange(3)
print(B)
print(numpy.exp(B))  # 每个元素的为指数,e为底的次方
print(numpy.sqrt(B))  # 每个元素的平方根

print("""\n------矩阵操作------\n
---------向下取整floor(),矩阵转向量ravel(),向量转矩阵a.shape(),矩阵转置a.T-----------------------""")
a = numpy.floor(10 * numpy.random.random((3, 4)))
print('矩阵a:\n{0}'.format(a), '\n')
print(a.ravel(), '\n')  # 向量转矩阵
a.shape = (6, 2)  # 矩阵转向量
print(a, '\n')
print(a.T, '\n')  # 矩阵转置
print(a.reshape(3, -1), '\n')  # 只管3行,列数多少自动计算

print("""\n------矩阵拼接------\n
---------按行拼接hstack(元组),按列拼接vstack(元组)------------------------------------------""")
a = numpy.floor(10 * numpy.random.random((2, 2)))
b = numpy.floor(10 * numpy.random.random((2, 2)))
print(a, '\n')
print(b, '\n')
print(numpy.hstack((a, b)), '\n')
print(numpy.vstack((a, b)), '\n')

print("""\n------矩阵切分------\n
---------纵切横分hsplit(矩阵,份数/(位置元组)),---横切纵分vsplit(矩阵,份数/(位置元组)),---------------""")
a = numpy.floor(10 * numpy.random.random((2, 12)))
print(a, '\n')
print(numpy.hsplit(a, 3), '\n')
print(numpy.hsplit(a, (3, 4)))  # 在第三个元素后切一刀,在第四个元素后切一刀
a = numpy.floor(10 * numpy.random.random((12, 2)))
print(a, '\n')
print(numpy.vsplit(a, 3))

print("""\n------复制问题------\n
-------------------------------------------指向操作----------------------------------------------------""")
"""
    python中,一切皆对象,a与b指向同一个对象。当命令b去改变对象时,a由于也是指向该对象,所以都会改变。
"""
a = numpy.arange(12)
b = a
print(b is a)
b.shape = (3, 4)
print(a.shape)
print(id(a))
print(id(b))

print("""-----------------------------浅拷贝a.view()----------------------------------------------------""")
"""
    一切皆对象,所以矩阵中的元素也是对象。
    类似于python中的copy.copy(),浅拷贝,只拷贝一层对象,也就是之拷贝矩阵,并不拷贝矩阵中的对象。
"""
c = a.view()
print(c is a)
c.shape = (2, 6)
print(a.shape)
c[0, 4] = 1234
print(a)
print(id(a))
print(id(c))
print("""-----------------------------深拷贝a.copy()----------------------------------------------------""")
"""
    一切皆对象,所以矩阵中的元素也是对象。
    类似于python中的copy.deepcopy(),深拷贝,拷贝所有层次的对象,不止拷贝矩阵,
    还将矩阵中元素所指向的对象也拷贝一份
"""
d = a.copy()
print(d is a)
d[0, 0] = 9999
print(d)
print(a)

print("""\n------按行按列取最大值------\n
---------------------a.argmax(按行axis = 1/按列axis = 0)---------------------------------------------------""")
data = numpy.sin(numpy.arange(20)).reshape(5, 4)
print(data)
ind = data.argmax(axis = 0)  # 每列的最大值,返回一个向量
print(ind)
print(data.shape[0])  # 返回行数
print(data.shape[1])  # 返回列数
data_max = data[ind, range(data.shape[1])]
print(data_max)

print("""\n------矩阵扩展------\n
---------------------a.tile(a,(行,列))---------------------------------------------------""")
a = numpy.arange(0, 40, 10)
print(a)
b = numpy.tile(a, (3, 5))
print(b)

print("""\n------元素排序------\n
-----------a.sort(按行axis = 1/按列axis = 0)---排序索引值numpy.argsort(a)---------------------""")
a = numpy.array([
    [4, 3, 5],
    [1, 2, 1]
])
print(a, '\n')
b = numpy.sort(a, axis = 1)
print(b, '\n')
a.sort(axis = 1)
print(a, '\n')

a = numpy.array([4, 3, 1, 2])
j = numpy.argsort(a)  # 返回排序索引从小到大2310,2号位最小,0号位最大
print(j, '\n')
print(a[j])

运行结果:

D:\Python\python.exe G:/编程/python/project/TYD/01/01/02/09-14.py

------以矩阵的方式读取数据------

------------genfromtxt函数('文件路径',delimiter = '分隔符',dtype = 读取方式)---------------------
<class 'numpy.ndarray'>
[['name' 'gender' 'age' 'contry']
['lilei' 'm' '18' 'cn']
['hanmeimei' 'f' '18' 'cn']
['lucy' 'f' '19' 'uk']
['lili' 'f' '17' 'usa']
['tom' 'm' '18' 'uk']]

------numpy.array------

------------numpy中最核心的结构------------------------------------------
[ 5 10 15 20]
[[ 5 10 15]
[20 25 30]
[35 40 45]]

------print(numpy对象.shape)------

------------打印矩阵结构(例如2×3,3×3之类)------------------------------------------
(4,)
(2, 3)

------numpy.array结构------

------------内部结构必须相同------------------------------------------
[1 2 3 4]
int32
[1. 2. 3. 4.]
float64
['1' '2' '3' '4']
<U11

------数据选取------

------------与python一样,通过索引读取数据------------------------------------------
[['name' 'gender' 'age' 'contry']
['lilei' 'm' '18' 'cn']
['hanmeimei' 'f' '18' 'cn']
['lucy' 'f' '19' 'uk']
['lili' 'f' '17' 'usa']
['tom' 'm' '18' 'uk']]
hanmeimei的国家是:cn

------切片选取------

------------与python一样,(起始值:终止值:步长)------------------------------------------
[ 5 10 15]
[2 5 8]
[[1 2]
[4 5]
[7 8]]

------numpy判断------

------------判断某个元素是否在矩阵当中------------------------------------------
[False True False False]
[[False True False]
[False False False]
[False False False]]
[10]
[False True False]
[[20 25 30]]
[False False False False]
[ True True False False]
[ 5 10]

------numpy.array类型的改变------

------------astype()函数,数据类型转换------------------------------------------
<U1
['1' '2' '3']
float64
[1. 2. 3.]

------numpy.array求极值的操作------

------------min(),max()函数------------------------------------------
5
20

------numpy.array按行求和,按列求和------

---------sum()方法---参数axis = 1按行,axis = 0按列------------------------------------------
[ 30 75 120]
[60 75 90]

------矩阵变换------

---------造矩阵:arange();矩阵变换:reshape()------------------------------------------
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
(3, 5)
2
int32
15

------初始化矩阵------

---------造0矩阵:zeros((元组表示矩阵行列))方法,创造1矩阵ones()方法------------------------------------------
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
[[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]

[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]

------序列矩阵------

---------aragne()方法------------------------------------------
[10 15 20 25]

------随机模块------

---------random((元组表示矩阵行列))方法------------------------------------------
[[6 7 3]
[9 3 9]]

------平均间隔矩阵------

---------linspase(起始值,最大值,个数)方法------------------------------------------
[0. 0.05789474 0.11578947 0.17368421 0.23157895 0.28947368
0.34736842 0.40526316 0.46315789 0.52105263 0.57894737 0.63684211
0.69473684 0.75263158 0.81052632 0.86842105 0.92631579 0.98421053
1.04210526 1.1 ]

------向量运算------

---------加减乘方------------------------------------------
[20 30 40 50]
[0 1 2 3]
[20 29 38 47]
[19 28 37 46]
[0 1 4 9]
[ True True False False]

------矩阵乘法------

---------对应位置乘法和点乘------------------------------------------
A矩阵:
[[1 1]
[0 1]]
B矩阵:
[[2 0]
[3 4]]
A*B对应位置相乘:
[[2 0]
[0 4]]
A·B点乘:
[[5 4]
[3 4]]
A·B点乘:
[[5 4]
[3 4]]

------矩阵科学计算------

---------e的幂,平方根------------------------------------------
[0 1 2]
[1. 2.71828183 7.3890561 ]
[0. 1. 1.41421356]

------矩阵操作------

---------向下取整floor(),矩阵转向量ravel(),向量转矩阵a.shape(),矩阵转置a.T-----------------------
矩阵a:
[[8. 2. 5. 7.]
[6. 5. 1. 3.]
[4. 9. 7. 9.]]

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

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

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

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


------矩阵拼接------

---------按行拼接hstack(元组),按列拼接vstack(元组)------------------------------------------
[[1. 7.]
[3. 7.]]

[[7. 6.]
[3. 6.]]

[[1. 7. 7. 6.]
[3. 7. 3. 6.]]

[[1. 7.]
[3. 7.]
[7. 6.]
[3. 6.]]


------矩阵切分------

---------纵切横分hsplit(矩阵,份数/(位置元组)),---横切纵分vsplit(矩阵,份数/(位置元组)),---------------
[[4. 0. 0. 8. 6. 3. 3. 8. 0. 0. 7. 6.]
[2. 1. 4. 3. 7. 8. 1. 6. 1. 0. 2. 9.]]

[array([[4., 0., 0., 8.],
[2., 1., 4., 3.]]), array([[6., 3., 3., 8.],
[7., 8., 1., 6.]]), array([[0., 0., 7., 6.],
[1., 0., 2., 9.]])]

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

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

------复制问题------

-------------------------------------------指向操作----------------------------------------------------
True
(3, 4)
62145264
62145264
-----------------------------浅拷贝a.view()----------------------------------------------------
False
(3, 4)
[[ 0 1 2 3]
[1234 5 6 7]
[ 8 9 10 11]]
62145264
62187344
-----------------------------深拷贝a.copy()----------------------------------------------------
False
[[9999 1 2 3]
[1234 5 6 7]
[ 8 9 10 11]]
[[ 0 1 2 3]
[1234 5 6 7]
[ 8 9 10 11]]

------按行按列取最大值------

---------------------a.argmax(按行axis = 1/按列axis = 0)---------------------------------------------------
[[ 0. 0.84147098 0.90929743 0.14112001]
[-0.7568025 -0.95892427 -0.2794155 0.6569866 ]
[ 0.98935825 0.41211849 -0.54402111 -0.99999021]
[-0.53657292 0.42016704 0.99060736 0.65028784]
[-0.28790332 -0.96139749 -0.75098725 0.14987721]]
[2 0 3 1]
5
4
[0.98935825 0.84147098 0.99060736 0.6569866 ]

------矩阵扩展------

---------------------a.tile(a,(行,列))---------------------------------------------------
[ 0 10 20 30]
[[ 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30]
[ 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30]
[ 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30 0 10 20 30]]

------元素排序------

-----------a.sort(按行axis = 1/按列axis = 0)---排序索引值numpy.argsort(a)---------------------
[[4 3 5]
[1 2 1]]

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

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

[2 3 1 0]

[1 2 3 4]

Process finished with exit code 0

猜你喜欢

转载自www.cnblogs.com/Mjerry/p/9625364.html