系列文章:
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还是2行6列的数组呢?
只是输出改变了形状,但本质没有发生变化
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, 35,37,39,41]])
数组和数组的乘除法:
In [81]: a*b
Out[81]:
array([[63, 88, 115, 144, 175, 208],
[108, 140, 174, 210, 248 ,288]])
In [92]: a #2行6列的数組
Out[92]:
array([[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
In [93]: c #1行6列的数組
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 #2行6列的数组
Out[114]:
array([[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
In [115]: c #2行1列的数組
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,可以进行计算