python数据分析(二)——numpy数组的计算

系列文章:
python数据分析(一)——numpy数组的创建
python数据分析(三)——numpy读取本地数据和索引
python数据分析(四)——numpy中的nan和数据的填充
python数据分析(五)——numpy+matplotlib实例



一、数组形状转换

代码如下(示例):

In[60]:a = np.array([3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9])
In[61]:a 
Out[61]:
array([[3, 4, 5, 6, 7, 8],
	  [4, 5, 6, 7, 8, 9]])

查看数组的形状:
In[62]:a.shape
Out[62]:(2, 6)

修改数组的形状:
In[63]:a.reshape(3, 4)
Out[63]:
array([[3, 4, 5, 6],
	  [7, 8, 4, 5],
	  [6, 7, 8, 9]])

In[64]:a.shape
Out[64]:(2, 6)
#为什么a还是26列的数组呢?
只是输出改变了形状,但本质没有发生变化

In[65]:b = a.reshape(3, 4)

In[66]:b.shape
Out[66]:(3, 4)

In[67]:b
Out[67]:
array([[3, 4, 5, 6],
	   [7, 8, 4, 5],
	   [6, 7, 8, 9]])

把数组转化为1维度数据
In[69]:b.reshape(1, 12)
Out[69]:array([[3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9]]) #这是二维数组 reshape中两个数值表示二维数组

In[70]:b.flatten()
Out[70]:array([3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9])

np.shape和np.reshape中一个值表示一维数组,两个值表示二维数组,三个值表示三个数组

数组形状转换

import numpy as np

# 一维数组
t1 = np.arange(12)
print(t1)
print(t1.shape)

# 二维数组
t2 = np.array([[1, 2, 3], [4, 5, 6]])
print(t2)
print(t2.shape)

# 三维数组
t3 = np.array([[[1, 2, 3, 4], [5, 6, 7, 8]], [[7, 8, 9, 10], [11, 12, 13, 14]], [[1, 2, 3, 4], [5, 6, 7, 8]]])
print(t3)
print(t3.shape)

# 修改数组维度
t4 = np.arange(12)
print(t4.reshape(3, 4))

print(12*"-")

# 两个三行四列的数组
t5 = np.arange(24).reshape(2, 3, 4)
print(t5)

# t5输出改变了形状,但本质没有产生变化
print(t5.reshape(4, 6))
print(t5)

# 如果想要改变数组,重新赋值
t5 = t5.reshape(4, 6)
print(t5)

# 变为一维数组
t5 = t5.reshape(24, )
print(t5)

# 变为二维数组 两个中括号
t5 = t5.reshape(24, 1)
print(t5)

t5 = t5.reshape(1, 24)
print(t5)

# 变为一维数组
print(t5.flatten())

二、数组计算

  • 数组与数值之间的计算类似于广播机制,数组中的每一个数都进行同样的加减乘除操作
  • 相同形状的数组之间的计算是对应位置直接进行加减乘除操作,和线性代数还是有区别的
  • 不同形状的数组但某一维度相同时,维度相同的进行对应位置的运算,例如行的维度相同,都是n个元素,直接进行行跟行之间对应位置的运算;列的维度相同,都是n个元素,直接进行列跟列之间对应位置的运算
  • 维度不同的数组之间进行运算会直接报错,因为程序无法一一对应
    在这里插入图片描述

数组和数的计算:

In[71]:a
Out[71]: 
array([[3, 4, 5, 6, 7, 8],
	   [4, 5, 6, 7, 8, 9]])

加法减法:
In[72]:a+1
Out[72] : 
array([[4, 5, 6, 7, 8, 9],
	   [5, 6, 7, 8, 9, 10]])
	   
乘法除法:
In[73]: a*3
Out[73] :
array([[9, 12, 15, 18, 21, 24],
	   [12, 15, 18, 21, 24, 27]])

numpy的广播机制造成的,在运算过程中,加减乘除的值被广播到所有元素上面

数组和数组的计算:

In [78]: a
Out[78]:
array([[3, 4, 5, 6, 7, 8],
	   [4, 5, 6, 7, 8, 9]])
	   
In [79]: b
Out[79]:
array([[21, 22, 23, 24, 25, 26],
	   [27, 28, 29, 30, 31, 32]])

数组和数组的加减法:
In [80]: a+b
Out[80]: 
array([[24, 26, 28, 30, 32, 34],
	   [31, 33, 35373941]])

数组和数组的乘除法:
In [81]: a*b
Out[81]:
array([[63, 88, 115, 144, 175, 208],
	   [108, 140, 174, 210, 248 ,288]])

In [92]: a #26列的数組
Out[92]:
array([[3, 4, 5, 6, 7, 8],
	   [4, 5, 6, 7, 8, 9]])

In [93]: c #16列的数組
Out[93]: array([1, 2, 3, 4, 5, 6])

In [94]: a-c
Out[94]:
array([[2, 2, 2, 2, 2, 2],
	   [3, 3, 3, 3, 3, 3]])

In [95]: a*C
Out[95]:
array([[3, 8, 15, 24, 35, 48],
	   [4, 10, 18, 28, 40, 54]])

In [114]: a #26列的数组
Out[114]:
array([[3, 4, 5, 6, 7, 8],
	   [4, 5, 6, 7, 8, 9]])

In [115]: c #21列的数組
Out[115]:
array([[1],
	   [2]])

In [116]: c+a #相加
Out[116]:
array([[4, 5, 6, 7, 8, 9],
	   [6, 7, 8, 9, 10, 11]])

In [117]: a*c #相乘
Out[117]:
array([[3, 4, 5, 6, 7, 8],
	   [8, 10, 12, 14, 16, 18]])

In [118]: с*a #相乘
Out[118]:
array([[3, 4, 5, 6, 7, 8],
	   [8, 10, 12 , 14, 16, 18]])

广播原则:

  • 如果两个数组的后援维度(即从末尾开始算起的维度)轴长度相符其中一方的长度为1,则认为他们是广播兼容的,广播会在缺失和(或)长度为1的维度上进行

问题一:shape为(3, 3, 3)的数组能够和(3, 2)的数组进行计算吗?

回答一不可以,三块三行三列的数组无法和三行两列的数组进行计算


问题二:shape为(3, 3, 2)的数组能够和(3, 2)的数组进行计算吗?

回答二可以,每一块也都是三行两列的数组,可以直接进行数组和数组的计算


问题三:shape为(3, 3, 2)的数组能够和(3, 1) / (1, 2)的数组进行计算吗?

回答三可以,后援数组其中一方为1,可以进行计算


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值