本文来源于数据《Python数据分析》动物书 。。
分享一下电子版本的下载地址:
[email protected]:hashmapybx/learn_python.git 这里可以下载到对应的pdf版本。
下面开始numpy的学习:
# coding: utf-8
# In[10]:
import numpy as np
arr1 = np.array([[[1,2,3], [3,4,5]], [[5,6,7], [7,8,9]]])
print(arr1.shape) # 2 2 3
print(arr1[1])
print("-----------------")
old_value = arr1[0].copy()
arr1[0] = 122 # 给一个数组赋值一个常量整数 这里在java,是不可以的
print(arr1)
print("+++++++++++++++++")
arr1[0] = old_value # 原始变回原来的数据
print(arr1)
# In[36]:
from numpy.random import randn
names = np.array(['bob', 'bob', 'will', 'joy', 'will', 'tom', 'jeery'])
data = randn(7, 4)
print(names == 'bob') # 将数组和一个字符串进行比较操作
# print(names[1:]) 1: 表示从第一个开始到结尾位置 切片都是视图操作的。
# print(names[:2])
print("============")
# 基于前面的额布尔数组来利用字符串进行检索
# print(data[names == 'bob']) 返回的结果是前面两行的结果数据的
print(data[names == 'bob']) # 这个的返回结果是2 * 4 数组
print(data)
# In[42]:
names = np.array(['bob', 'bob', 'will', 'joy', 'will', 'tom', 'jeery'])
mask = (names == 'bob') | (names == 'joy') # 可以利用与 或 的操作在数组上面进行的
print(mask)
data = randn(7, 4)
print(data)
# 打印数组里面大于0的数字 或者把小于0的替换成0
data[data < 0] = 0
print(data)
# 通过一位布尔数组来设置整列或者整行数据
data[names != 'joy'] = 7 # 通过行来操作的。
print(data)
# In[45]:
# 花式索引
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
print(arr)
# 以特定的顺序来获取子序列
# 给数组穿进去一个序列
print(arr[[2,4,6]]) # 返回的结果是2,4,6行的数据
# 使用负数索引的话,则将会从末尾开始检索的
# In[51]:
# 在数组里面穿进去多个索引数组
arr = np.arange(32).reshape((8,4))
print(arr)
print("==========")
print(arr[[0,1,4, 7], [2,3, 2, 0]]) # 返回的是坐标(0,2) (1,3) (4, 2) (7, 0) 的位置上面的元素
# 但是我们希望返回的额结果吗能是矩阵的形式
print(arr[[1,2]][:, [1,2]]) # : 代表的是某一行的所有元素 后面的[1,2] 代表该行的位置的索引
#返回是一个矩阵的区域
"""
想要返回矩阵块的第二种方法的操作
利用np.ix_函数,该函数会把两个一维的数组转化为矩形区域的检索的器
花式索引的操作是对数据复制到新的数组中的
"""
print(arr[np.ix_([1, 3 ,2, 5], [3, 2,1])]) #返回的结果就是4 * 3
# In[13]:
# 数组的转置操作
import numpy as np
arr = np.arange(15).reshape((3,5))
print(arr.T) # 转置
from numpy.random import randn
'''
randn(d0, d1,...dn) 函数返回结果是一个数或者一组样本, 这些数据具有标准正太分布
其中的dn表示的是维度
'''
arr1 = np.random.randn(6, 3) # 表示的是6 * 3的矩阵
print(arr1)
# 矩阵的内积操作
print(np.dot(arr1.T, arr1)) # 结果是3*3
# 对于高维数组的操作中d的话,我们希望串进行去一个表示轴编号(表示行编号)的元组
arr2 = np.arange(16).reshape((2,2,4))
print(arr2)
print("-------------------")
arr3 = arr2.transpose((1,0,2))
# print(arr3)
# 利用一个方法进行转置操作 swapaxes
arr5 = arr2.swapaxes(0, 1)
print(arr5)
# In[11]:
import numpy as np
from numpy.random import randn
points = np.arange(-5, 5, 0.01)
xs, ys = np.meshgrid(points, points)
# print(ys)
# print(xs)
import matplotlib.pyplot as plt
# 计算表达式的值
# z = x^2 + y^2
z = np.sqrt(xs ** 2 +ys ** 2)
plt.imshow(z, cmap=plt.cm.gray); plt.colorbar()
plt.title('Image plot of $\sqrt{x^2 + y^2}$ for a grid of value')
# In[ ]:
# 将条件标书转化为数组运算
import numpy as np
import matplotlib.pyplot as plt
xarr = np.array([1.2, 1.23, 1.4, 3.4])
yarr = np.array([2.1, 3.2, 4.5, 5.6])
cond = np.array([True, False, True, False])
# 现在我们的需求是,当cond里面值为true的话,我们选xarr里面的值,当值为false的话,我们选择yarr的值
result = [
(x if c else y)
for x, y, c in zip(xarr, yarr, cond)
]
print()
# In[8]:
import numpy as np
from numpy.random import randn
# where关键字的用法
arr = randn(4, 4)
print(arr)
# 下面的where表达式可以将大于0的数据替换成2 小于0 的替换成-2
np.where(arr > 0, 2, -2)
# 现在我们只是想要把大于0的替换了
np.where(arr> 0, 2 , arr)
# 例子现在假设我们有两个条件的数组
cond1 = np.array([True, False, True, True])
cond2 = np.array([False, False, True, True])
result = []
for i in range(4):
if cond1[i] and cond2[i]:
result.append(0)
elif cond1[i]:
result.append(1)
elif cond2[i]:
result.append(2)
else:
result.append(3)
for i in result:
print("序号:%s 值:%s" % (result.index(i) + 1, i))
# 看看where的表达式
np.where(cond1 & cond2, 0, np.where(cond1, 1, np.where(cond2, 2, 3))) # 等价于上面的for循环的表达式
# In[19]:
arr1 = np.random.randn(5,4)
print(arr1) # 生成具有正太分布的矩阵5* 4 5行4列
# 求均值
print(arr1.mean())
print(arr1.sum(0)) # 求和
# 下面是不进行聚合的函数的操作
arr3 = np.array([[0,1,2], [3,4,5], [5,6,7]])
print(arr3.cumsum(1)) # 从上往下逐行进行累加
print(arr3.cumprod(0)) # 对于列的操作 从左往右开始想乘累加 这里的参数 0 表示是行的方向上面的操作 1表示的是列上的操作
# In[22]:
# 用于布尔数组的操作函数
arr = randn(100)
print((arr >0).sum()) # 55 表示的是在sum用来对于布尔数组里面true的个数和进行求解
bools = np.array([False, True, False, True])
print(bools.any()) # any用于测试是否在数组里面存在一个或者多个True
print(bools.all()) # 检查所值是否都是True
# In[33]:
# 排序的操作 对于一维数组的排序
arr = randn(100)
arr.sort()
# print(arr)
#对于多维数组的排序操作 只需要把对应的轴向的编号穿进去就OK了
arr1 = randn(5,3)
arr1.sort(0) # 0表示行方向的排序 是升序 1 表示的是列的方向的
print(arr1)
# numpy里面的数组去重操作
names = np.array(['bob', 'jerry', 'bob', 'tom'])
print(np.unique(names)) # 这些操作是在数组的副本上面呢进行的
# python里面的等价的去重操作
print(sorted(set(names)))
# python 里面判断一个数是否在数组里面的操作 或者是一个数组中的值是否在另外一个数组里面返回结果的是boolean的值
values = np.array([6,0,0,3,4,5])
arr2 = np.in1d(values, [1,2,3])
print(arr2) # 返回的结果对于第一个组的长度是一样的
# In[34]:
# 用于数组的 文件的输出和输入的操作
# numpy里面的文件你的读写操作磁盘的型的情况 对应的函数 np.load() np.save()
arr = range(10)
np.save('some_array', arr)
# In[36]:
arr = np.load('some_array.npy')
print(arr)
# np.savez 保存成一个压缩文件 np.savetxt 保存txt文本
np.savez('array_archive.npz', a=arr, b = arr)
# In[37]:
arch = np.load('array_archive.npz') # 返回的结果是一个类似字典的数据类型的
print(arch['a'])
# In[43]:
# 存取文本的数据的操作
#-*- coding:utf-8 -*-
# SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape woindows下面的额需要转椅'\ ''
arr = np.loadtxt('C:/Users/rocky/Desktop/array.txt', delimiter=',')
print(arr)
np.savetxt('d:/aaa.txt', arr, delimiter='|')
# In[59]:
# 线性代数运算
x = np.array([[1., 2., 3.],[4., 5., 6.]])
# print(x.shape)
# print(np.ones(3).shape) # 返回的数组是 3*1 的全是1的数组矩阵
# print(np.dot(x, np.ones(3)).shape)
#numpy.linalg 函数提供了求解行列式 矩阵得分解等
from numpy.linalg import inv, qr
X = randn(4,4)
Y = randn(4, 3)
mat = X.T.dot(X)
# print(mat)
#
# inv 计算矩阵的逆 必须是方阵才可以求逆的
print(mat.dot(inv(mat)))
# QR分解
q,r = qr(mat)
print(q)
# In[ ]: