NumPy(二):广播

NumPy

  • 广播
  • 数组操作
      • 沿指定轴连接相同形状的两个或多个数组
      • 沿新轴连接数组序列
      • 垂直堆叠生成数组
      • 数组的追加
  • 一些重要函数
      • ufunc函数
        • 自定义函数np.frompyfunc()
      • 数学函数
      • 统计函数
      • numpy.where()
      • 多重分支判断选择函数numpy.select()

广播

广播(Broadcast)是numpy对不同形状(shape)的数组进行数值计算的方式
当运算中的2个数组的形状不同时,numpy将自动触发广播机制
实例:

import numpy as np
a = np.array([[0, 0, 0], [10, 10, 10], [20, 20, 20], [30, 30, 30]])
b = np.array([1, 2, 3])
print(a + b)
'''
输出
[[ 1  2  3]
 [11 12 13]
 [21 22 23]
 [31 32 33]]
'''

图解:
NumPy(二):广播_第1张图片

数组操作

函数格式 函数作用
numpy.reshape(arr,newshape,order=‘C’) numpy.reshape函数可以在不改变数据的条件下修改形状
numpy.transpose(arr,axes) numpy.transpose函数用于对换数组的维度
numpy.ndarray.T 转质
numpy.squeeze(arr,axis) numpy.squeeze函数从给定数组的形状中删除一维的条目(移除长度为1的轴)

沿指定轴连接相同形状的两个或多个数组

numpy.concatenate((a1,a2,...),axis)

⚫a1,a2,…:相同类型的数组
⚫axis:沿着它连接数组的轴,默认为0
实例


import numpy as np
a = np.array([[1, 2], [3, 4]])
print('第一个数组:')
print(a)
b = np.array([[5, 6], [7, 8]])
print('第二个数组:')
print(b)  # 两个数组的维度相同
print('沿轴0连接两个数组:')
print(np.concatenate((a,b)))
print('\n')
print('沿轴1连接两个数组:')
print(np.concatenate((a,b),axis=1))
'''
输出
第一个数组:
[[1 2]
 [3 4]]
第二个数组:
[[5 6]
 [7 8]]
沿轴0连接两个数组:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]


沿轴1连接两个数组:
[[1 2 5 6]
 [3 4 7 8]]

'''

沿新轴连接数组序列

numpy.stack(arrays,axis)

⚫arrays相同形状的数组序列
⚫axis:返回数组中的轴,输入数组沿着它来堆叠
会增加一个新的轴(立体阵)

// An highlighted block
import numpy as np
a = np.array([[1, 2], [3, 4]])
print('第一个数组:')
print(a)
b = np.array([[5, 6], [7, 8]])
print('第二个数组:')
print(b)
print('沿轴0堆叠两个数组:')
print(np.stack((a, b), 0))
print('沿轴1堆叠两个数组:')
print(np.stack((a, b), 1))
print('沿轴2堆叠两个数组:')
print(np.stack((a, b), 2))
'''
输出
第一个数组:
[[1 2]
 [3 4]]
第二个数组:
[[5 6]
 [7 8]]
沿轴0堆叠两个数组:
[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]
沿轴1堆叠两个数组:
[[[1 2]
  [5 6]]

 [[3 4]
  [7 8]]]
沿轴2堆叠两个数组:
[[[1 5]
  [2 6]]

 [[3 7]
  [4 8]]]

垂直堆叠生成数组

numpy.vstack

import numpy as np
a = np.array([[1, 2], [3, 4]])
print('第一个数组:')
print(a)
b = np.array([[5, 6], [7, 8]])
print('第二个数组:')
print(b)
print('水平堆叠:')
c = np.hstack((a, b))
print(c)
d = np.vstack((a, b))
print(d)
'''
输出
第一个数组:
[[1 2]
 [3 4]]
第二个数组:
[[5 6]
 [7 8]]
水平堆叠:
[[1 2 5 6]
 [3 4 7 8]]
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

进程已结束,退出代码0

'''

数组的追加

numpy.append函数在数组的末尾添加值。追加操作会分配整个数组,并把原来的数组复制到新数组中。
下面展示一些 内联代码片

numpy.append(arr,values,axis=None)

•arr:输入数组
•values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)
•axis:默认为None。当axis无定义时,是横向加成,返回总是为一维数组!当axis为0时,数组是加在下边(列数要相同);当axis为1时,数组是加在右边(行数要相同)。

import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print('第一个数组:')
print(a)
print('向数组添加元素:')
print(np.append(a, [7, 8, 9]))
print('沿轴0添加元素:')
print(np.append(a, [[7, 8, 9]], axis=0))
print('沿轴1添加元素:')
print(np.append(a, [[5, 5, 5], [7, 8, 9]], axis=1))
'''
输出
第一个数组:
[[1 2 3]
 [4 5 6]]
向数组添加元素:
[1 2 3 4 5 6 7 8 9]
沿轴0添加元素:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
沿轴1添加元素:
[[1 2 3 5 5 5]
 [4 5 6 7 8 9]]
 '''

一些重要函数

ufunc函数

ufunc是universalfunction的缩写,它是一种能对数组的每个元素进行运算的函数。
NumPy(二):广播_第2张图片
NumPy(二):广播_第3张图片
NumPy(二):广播_第4张图片

NumPy(二):广播_第5张图片

自定义函数np.frompyfunc()

通过np.frompyfunc()可以将计算单个值的函数转换为能对数组的每个元素进行计算的ufunc函数

f_ufunc=np.frompyfunc(f,nin,nout)

f是计算单个元素的函数,nin是func的输入参数的个数,nout是func的返冋值的个数,f_ufunc是ufunc函数对象,作为一个新的函数,它实现了f函数的ufunc功能。f_ufunc()的调用格式为:y=f_ufunc(与f中定义的形参对应的实际参数)
实例:

import numpy as np
def f(a,b,c,x):
    #计算二次函数的值
    return a*x**2+b*x+c
a,b,c=1,0,7
#传入参数
x=np.array([0,1,2])
#创建数组
f_ufunc=np.frompyfunc(f,4,1)
#输入4个变量a,b,c和x,输出1个参数计算之后的列表
y=f_ufunc(a,b,c,x)
#调用函数
print(y.dtype)
y=y.astype(np.float)
print(y.dtype)
print(y)
'''
输出:

object
float64
[ 7.  8. 11.]

'''

数学函数

NumPy(二):广播_第6张图片

统计函数

NumPy(二):广播_第7张图片
按指定轴统计时,在函数内加入axis = 轴名 即可
例如:max(axis=1)#axis=1按行 axis=0为按列

numpy.where()

实例

import numpy as np
x = np.arange(9.).reshape(3, 3)
print('我们的数组是:')
print(x)
print('大于3的元素的索引:')
y = np.where(x > 3)
print(y)
print('使用这些索引来获取满足条件的元素:')
print(x[y])
'''
输出:
我们的数组是:
[[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]]
大于3的元素的索引:
(array([1, 1, 2, 2, 2], dtype=int64), array([1, 2, 0, 1, 2], dtype=int64))
使用这些索引来获取满足条件的元素:
[4. 5. 6. 7. 8.]
'''

多重分支判断选择函数numpy.select()

用来计算分段函数之类的问题

你可能感兴趣的:(实训)