numpy数组

#!/usr/bin/env python
# coding: utf-8

numpy其实就是一个多维的数组对象,下载方式:
pip install numpy
pip install pandas

shape 和 dtype

# In[3]:


import numpy as np
data = [1,2,3,4,5]
n = np.array(data * 10)
print(data)
print(n)


# ### 每一个np的数组都有一个shape和一个叫做dtype的方法

# In[7]:


n.shape # shape属性表示获取到np数组的维度(长度)


# In[8]:


n.dtype # dtype属性表示获取到数组的类型

嵌套序列

是由一组等长列表组成的列表

# In[13]:


arr = [[1,2,3,4], [1,2,3,4]]
arr2 = np.array(arr)
print(arr2)
np.array(arr)
print(arr2.ndim) # ndim代表了维度
print(arr2.shape) # 

np对数据类型的一个判断

# In[19]:


# 不好的示范来进行讲解

arr = [[1,'2',3,4], [5,6,7,8]]
arr2 = np.array(arr)
print(arr2)
print(arr2.dtype) # unicode类型


# In[20]:


arr = [[1,2,3,4], [5,6,7,8]]
arr2 = np.array(arr)
print(arr2)
print(arr2.dtype) 


# In[22]:


arr = [[1,2.1,3,4], [5,6,7,8]]
arr2 = np.array(arr)
print(arr2)
print(arr2.dtype)  # 当成员当中有一个为float时,那么numpy将会推断成为float64类型

numpy进行指定长度数组的创建

np.zeros(10)


# In[24]:


np.ones((2,3))


# In[25]:


np.empty((2,3,4))


# In[27]:


np.arange(10) # arange是range函数的数组版本


# In[30]:


arr = np.array([1.2,1.6,1.8,-2.3,-5.8])
print(arr)
print(arr.dtype)
print(arr.astype(np.int32)) # 转化(astype)为int32(np.int32)数据类型


# ### int 8 16 32 64
# ### float类型 16(半精度) 32(标准单精度) 64(标准双精度) 128(扩展精度)

矢量化

数组通常不用在编写循环的情况下就可以进行批量运算

# In[32]:


arr1 = np.array([1,2,3,4])
arr2 = np.array([5,6,7,8])
arr1 + arr2


# In[34]:


arr1 = np.array([[1,2,3,4], [1,2,3,4]])
arr2 = np.array([[5,6,7,8], [9,6,7,8]])
arr1 + arr2


# In[35]:


arr1 = np.array([[1,2,3,4], [1,2,3,4]])
arr2 = np.array([[5,6,7,8], [9,6,7,8]])
arr1 * arr2


# In[38]:


arr1 = np.array([[1,2,3,4], [1,2,3,4]])
arr2 = np.array([[5,6,7,8], [9,6,7,8]])
print(arr1 - arr2)
print(arr2 - arr1)


# In[40]:


arr1 = np.array([[1,2,3,4], [1,2,3,4]])
arr2 = np.array([[5,6,7,8], [9,6,7,8]])
arr1 / arr2
arr2 / arr1

维度不等的

# In[42]:


arr1 = np.array([[1,2,3,4], [10,2,3,4]])
5 * arr1 # 广播

numpy数组的索引和切片操作

# In[44]:


arr = np.arange(10)
print(arr)
print(arr[1])
print(arr[4:])

arr[0:4] = 11
print(arr)

arr_copy = arr.copy()
print(arr_copy)


# In[47]:

一个二维数组的访问方式

arr1 = np.array([[1,2,3], [4,5,6]])
print(arr1[0][1])
print(arr1[0, 1])


# In[52]:


names = np.array(['Tony', 'Jack', 'Robin'])
print(names == 'Tony')                    # 广播出去了!!
print((names == 'Tony') & (names == 'Robin')) # and 操作!!
print((names == 'Tony') & (names == 'Tony'))
print((names == 'Tony') | (names == 'Robin')) # or 操作!!

花式索引(Fancy indexing)

它是一个NumPy中的索引,指的是利用整数数组进行索引

# In[56]:


arr = np.empty((8, 4))
print(arr)
print('++++++++++++++++++++++++++++')
for i in range(8):
    arr[i] = i
print(arr)
print('++++++++++++++++++++++++++++')
print(arr[[4, 3, 0 ,6]]) # 分别访问第四行第三行第0行。。。。
# 以一个特定的顺序来选取行中的子集,我们传入一个用于指定顺序的整数列表,或数组
# 这里也可以用负数索引从末行获取


# In[66]:


arr = np.arange(32).reshape((8, 4))
print(arr)
print('++++++++++++++++++++++++++++++++++++++')
print(arr[[1, 5, 7, 2]])
print('++++++++++++++++++++++++++++++++++++++')
print(arr[[1, 5, 7, 2], [0, 3, 1, 2]]) # 先分别选行,然后分别选列


# In[69]:


# 对比上面的操作
print(arr[[1, 5, 7, 2]])
print('++++++++++++++++++++++++++++++++++++++++++++++++')
print(arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]) # 这里的“:”表示:选择所有行之后,再每行分别对列依次选择。
# 再选择完1,5,7,2行的数据后,我们来进行列上的一个选择

print('++++++++++++++++++++++++++++++++++++++++++++++++')
print(arr[np.ix_([1,5,7,2], [0,3,1,2])]) # 这函数np.ix_()表示的是:先依次找出各个行,
                                         # 然后再对每行依次找列,等价于上面

数组转置和轴对换

转置就是重塑数组的一种特殊的形式,常用的方法 T 和 transpose

# In[75]:


arr = np.arange(15).reshape((3, 5))
print(arr)
print('-' * 80)
print(arr.transpose())
print('-' * 80)
print(arr.T)


# In[79]:


arr= np.arange(24).reshape((2,3,4))

print('-' * 80)
print(arr)

print('-' * 80)
print(arr.transpose((1,2,0)))
print('-' * 80)
print(arr.transpose((1,0,2)))


# In[84]:


arr2 = np.arange(10)
print(np.sqrt(arr2))
print(np.exp(arr2))


# In[95]:


x = np.random.randn(8)
y = np.random.randn(8)
print(x, y, sep = '\n--------------------------------\n')
np.maximum(x, y)
points = np.arange(-5, 5, 1) # 产生-5至5之间,间隔1的10个数
print('-' * 50)
print(points)

# xs按行重复points元素10次,ys按列重复points元素10次
xs, ys = np.meshgrid(points, points) # 采样点的生成
print('-' * 50)
print(xs)
print('-' * 50)
print(ys)

matplotlib入门

# pip install matpoltlib
import matplotlib.pyplot as plt
z = np.sqrt(xs ** 2 + ys **2)
plt.imshow(z, cmap=plt.cm.gray) # imshow 就是一个绘图函数
plt.colorbar()
plt.title('Imange plot of $\sqrt{x^2+y^2}$ for a grid of values')
plt.show()# 显示图形

绘图入门

条件逻辑转数组

np.where 等同于 x if condition else y 矢量化的一个版本;
x if condition else y 表示的意思是当条件condition成立时,表达式的返回值是x,不成立时返回值是y;
np.where 的写法,一般用于根据一个数组产生一个新的数组,跟python中函数式变成中的map、reduce等函数类似。

# In[104]:


x_arr = np.array([1.1, 1.2, 1.3])
y_arr = np.array([2.1, 2.2, 2.3])
condition = np.array([True, False, True])

# 原始版本
result = [(x if z else y) for x, y, z in zip(x_arr, y_arr, condition)]
print(result)


# In[105]:


# 等价于上面
r = np.where(condition, x_arr, y_arr)
print(r)

值替换

arr = np.random.randn(4, 4)
print(arr)
print('-' * 50)

arr_1 = np.where(arr > 0, 2, -2)
print(arr_1)
print('-' * 50)

arr_2 = np.where(arr < 0, -1, arr)
print(arr_2)
print('-' * 50)

numpy 的数学运算

常用函数 sum mean std

# In[113]:


arr = np.random.randn(4, 4)
print(arr)
print('-' * 50)
print(arr.mean())
print('-' * 50)
print(np.mean(arr))
print('-' * 50)
print(arr.sum())
print('-' * 50)
print(arr.std())
print('-' * 50)


# In[118]:


### 在一个轴上进行运算
arr = np.arange(20).reshape((4, 5))
print(arr)
print('-' * 50)
print(arr.mean(axis = 1)) # 计算轴1上的平均值
print('-' * 50)
print(arr.sum(0))


#  argmin  argmax  cumsum

排序方法

# In[119]:


arr = np.random.randn(4)
print(arr)
arr.sort() # 从小到大
print('-' * 50)
print(arr)

多维数组排序

arr = np.random.randn(4, 4)
print(arr)
arr.sort(1) # 传递轴号,按轴来进行排序
print('-' * 50)
print(arr)
arr.sort()
print('-' * 50)
print(arr)


# In[134]:


arr = np.random.randn(4, 4)
print(arr)
arr.sort()
print('-' * 50)
print(arr)
arr.sort(1)
print('-' * 50)
print(arr)
arr.sort(0)
print('-' * 50)
print(arr)
print(arr.sort(1) == arr.sort())

numpy的文件操作

  • numpy 可以读写磁盘上的文本数据或者是二进制数据
  • 主要应用的函数就是 np.save 和 np.load,默认情况下数据是以未压缩的原始二进制格式保存在扩展名.npy的文件中
arr = np.arange(10)
print(arr)
np.save('any_array', arr)
print('-' * 50)
np.load('any_array.npy')


# In[140]:


arr = np.arange(10)
np.savez('any_array_1', a = arr) 
# 保存成一个压缩文件,数组以关键字参数的形式传入

np.load('any_array_1.npz')['a']


# In[146]:


arr = np.arange(10)
np.savez('any_array_2.npz',a = arr) 
# 保存成一个压缩文件,数组以关键字参数的形式传入

np.load('any_array_2.npz')['a']


# In[149]:


arr = np.arange(10)
np.savetxt('any_array.txt', arr, delimiter=',')
# 这就是保存了一个文本文件,分隔符指定为位逗号
np.loadtxt('any_array.txt', delimiter=',')

线性代数

  • dot 矩阵的乘法运算
  • trace 计算对角线元素的和
  • det 计算矩阵的行列式
  • eig 计算方阵的本征值和本征向量
  • inv 计算方阵的逆
# In[153]:


x = np.array([[1,2,3], [4,5,6]])
y = np.array([[1,2], [4,5], [7,8]])
print(x.dot(y), y.dot(x), sep = '\n---------------\n')

随机漫步的例子

# In[166]:


# 求什么时候第一次,距离初始点十步远
position = 0 # 初始化一个位置的值
walk = [position] # 步值的初始化
steps = 1000 # 步数设置
for i in range(steps):
    step = 1 if np.random.randint(0, 2) else -1
    position += step
    walk.append(position)
    
# 画图
plt.plot(walk)

# 求什么时候第一次距离初始点十步远
print((np.abs(walk) >= 10).argmax()) # 难怪前面的判断返回的是布尔值,所以才会返回第一个true
print((np.abs(walk) >= 10))
# numpy.argmax(array, axis) 用于返回一个numpy数组中最大值的索引值。
# 当一组中同时出现几个最大值时,返回第一个最大值的索引值。

输出:
404
[False False False … True True True]
随机漫步

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值