1.5 NumPy数组的计算:广播

目录

  • 第一章 numpy入门

    • 1.5 数组的计算:广播

      • 1.5.1 广播的介绍
      • 1.5.2 广播的规则
      • 1.5.3 广播的实际应用

第一章 numpy入门

1.5 数组的计算:广播

1.5.1 广播的介绍

对于同样大小的数组,二进制操作是对相应元素的逐个计算:

import numpy as np

a = np.array([1,3,5])
b = np.array([2,4,6])
c = np.ones((3,3))
print("原数组a:\n",a)
print("原数组b:\n",b)
print("元数组c:\n",c)
print("同大小数组相加:\n",a + b)

# 广播允许不同大小数组的二进制操作,如:简单的将一个标量和一个数组相加;
print("数组与标量相加:\n",a + 10)
print("二维数组与一维数组相加:\n",c + a)

x = np.arange(3)
y = np.arange(3)[:,np.newaxis]
print("原数组x:\n",x)
print("原数组y:\n",y)
print("不同二维数组间相加:\n",x + y)
原数组a:
 [1 3 5]
原数组b:
 [2 4 6]
元数组c:
 [[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
同大小数组相加:
 [ 3  7 11]
数组与标量相加:
 [11 13 15]
二维数组与一维数组相加:
 [[ 2.  4.  6.]
 [ 2.  4.  6.]
 [ 2.  4.  6.]]
原数组x:
 [0 1 2]
原数组y:
 [[0]
 [1]
 [2]]
不同二维数组间相加:
 [[0 1 2]
 [1 2 3]
 [2 3 4]]

1.5.2 广播的规则

NumPy的广播遵循一组严格的规则,这顶这组规则是为了决定两个数组间的操作。

规则1:如果两个数组的维度数不相同,那么小维度的数组的形状将会在最左边补1。

规则2:如果两个数组的形状在任何一个维度上都不匹配,那么数组会沿着维度为1的维度扩展一匹配另外一个数组的形状、

规则3:如果两个数组在任意一个维度上都不匹配并且没有任何一个维度等于1,那么会引发异常。

1.广播实例1

a = np.arange(6).reshape((2,3))
b = np.arange(3)
print("数组a形状:",a.shape,"\n",a)
print("数组b形状:",b.shape,"\n",b)
# 根据规则1:数组b左边补1 变为 (1,3) ---> [[0 1 2]]
# 根据规则2:数组b沿一维扩展为 (2,3) ---> [[0 1 2]
#                                        [0 1 2]]
print()
print("数组a + b:\n",a + b)
数组a形状: (2, 3)
 [[0 1 2]
 [3 4 5]]
数组b形状: (3,)
 [0 1 2]

数组a + b:
 [[0 2 4]
 [3 5 7]]

2.广播实例2

a = np.arange(3).reshape((3,1))
b = np.arange(3)
print("数组a形状:",a.shape,"\n",a)
print("数组b形状:",b.shape,"\n",b)
# 根据规则1:数组b左边补1 变为 (1,3) ---> [[0 1 2]]
# 根据规则2:数组b沿一维扩展为 (3,3) ---> [[0 1 2]
#                                        [0 1 2]
#                                        [0 1 2]]
# 根据规则2:数组a沿一维扩展为 (3,3) ---> [[0 0 0]
#                                        [1 1 1]
#                                        [2 2 2]]
print()
print("数组a + b:\n",a + b)
数组a形状: (3, 1)
 [[0]
 [1]
 [2]]
数组b形状: (3,)
 [0 1 2]

数组a + b:
 [[0 1 2]
 [1 2 3]
 [2 3 4]]

3.广播实例3

a = np.arange(6).reshape((3,2))
b = np.arange(3)
print("数组a形状:",a.shape,"\n",a)
print("数组b形状:",b.shape,"\n",b)
# 根据规则1:数组b左边补1 变为 (1,3) ---> [[0 1 2]]
# 根据规则2:数组b沿一维扩展为 (3,3) ---> [[0 1 2]
#                                        [0 1 2]
#                                        [0 1 2]]
# 根据规则3:最终形状还是不匹配,因此两个舒数组不兼容。执行会出错:
print("数组a + b:\n",a + b)
数组a形状: (3, 2)
 [[0 1]
 [2 3]
 [4 5]]
数组b形状: (3,)
 [0 1 2]
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-36-4f3ac961c6c5> in <module>()
      9 #                                            [0 1 2]]
     10 # 根据规则3:最终形状还是不匹配,因此两个舒数组不兼容。执行会出错:
---> 11 print("数组a + b:\n",a + b)
ValueError: operands could not be broadcast together with shapes (3,2) (3,) 

1.5.3 广播的实际应用

原文地址:https://www.cnblogs.com/-xiaoyu-/p/12312098.html

时间: 2024-10-08 07:04:11

1.5 NumPy数组的计算:广播的相关文章

numpy数组广播

numpy数组的广播功能强大,但是也同时让人疑惑不解,现在让我们来谈谈其中的原理. 广播原则: 如果两个数组的后缘维度(即:从末尾开始算起的维度)的轴长相符或其中一方的长度为1,则认为它们是广播兼容的,广播会在缺失和(或)长度为1的轴上进行. 上面的原则很重要,是广播的指导思想,下面我们来看看例子. 1.其实在最简单的数组与标量数字之间的运算就存在广播,只是我们把它看作理所当然了. 2.再看下一个例子,这个大家都会一致认为这是广播了 根据广播原则:arr1的shape为(4,1),arr2的sh

【Python实战15】NumPy数组的创建

NumPy提供了一个N维数组对象,即:ndarray.ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的. 创建ndarray数组 创建数组最简单的方式就是使用array函数,它接受一切序列型的对象,然后产生一个新的含有传入数据的NumPy数组.如下: 嵌套的序列将会被转换为一个多为数组: 除非显示的说明,np.array会尝试为新建的这个数组推断出一个较为合适的数据类型,我们可以通过dtype来进行查看,比如上面刚建立的数组类型为:int32类型:另,我们可以

数据分析(1) Numpy数组

Numpy的数组类被称作ndarray,通常被称作数组. 特点:元素类型相同,数量事先给定. 1 创建方式 (1)array( ):接收一个普通的Python序列(元组与列表并无区别),并将其转换为ndarray: # 使用列表创建 list1 = [1, 2, 3, 4, 5] print('使用一维列表创建:\n', np.array(list1)) list2 = [[1, 2, 3], [4, 5, 6]] print('使用二维列表创建:\n', np.array(list2)) #

numpy 数组对象

numpy 数组对象NumPy中的ndarray是一个多维数组对象,该对象由两部分组成:实际的数据,描述这些数据的元数据# eg_v1 import numpy as np a = np.arange(5) # 创建一个包含5个元素的NumPy数组a,取值分别为0~4的整数 print (a) # [0 1 2 3 4] print (a.dtype) # dtype 查看数组的数据类型 # int32 (数组a的数据类型为int32) # 确定数组的维度(数组的shape属性返回一个元组(tu

数组长度计算

(1)sizeof     方法:sizeof(数组名)/ sizeof(数组类型名)      说明:数组占用字节除以数组类型所占字节,结果为数组元素个数    (2)strlen     说明:strlen,求字符串有效长度     方法:strlen(字符数组名)  //结果为字符数组有效字符长度,不包含末尾的' /0' 注意:当数组作为函数參数传递时,数组名代表的是数组的首址,而非数组内容,故无法使用sizeof和strlen:所以,在传址时,应提供2个參数:1个是数组名,代表数组首地址

Python numpy数组扩展效率问题

Numpy库的ndarray数组可以方便地进行各种多维数据处理工作 可是它最大的缺点就是不可动态扩展--"NumPy的数组没有这种动态改变大小的功能,numpy.append()函数每次都会重新分配整个数组,并把原来的数组复制到新数组中."(引用自http://blog.chinaunix.net/uid-23100982-id-3164530.html) 场景: 今天用ndarray处理 42000 条数据时,就遇到了数组扩展的效率问题 文件名:train.csv(后附下载) 文件大

numpy数组、向量、矩阵运算

可以来我的Github看原文,欢迎交流. https://github.com/AsuraDong/Blog/blob/master/Articles/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/numpy%E6%95%B0%E7%BB%84%E3%80%81%E5%90%91%E9%87%8F%E3%80%81%E7%9F%A9%E9%98%B5%E8%BF%90%E7%AE%97.md import numpy as np import pandas as pd

NumPy数组基本的索引和切片

对一维数组来说,NumPy数组的索引切片与Python列表的功能差不多: >>> arr array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> arr[3] 3 >>> arr[2:6] array([2, 3, 4, 5]) >>> arr[3:] array([3, 4, 5, 6, 7, 8, 9]) 但是,特别注意的是,如果要将一个标量值赋值给一个切片,这个修改会直接反映到源数组上(即使你已经新建

Numpy数组对象的操作-索引机制、切片和迭代方法

前几篇博文我写了数组创建和数据运算,现在我们就来看一下数组对象的操作方法.使用索引和切片的方法选择元素,还有如何数组的迭代方法. 一.索引机制 1.一维数组 In [1]: a = np.arange(10,16) In [2]: a Out[2]: array([10, 11, 12, 13, 14, 15]) #使用正数作为索引 In [3]: a[3] Out[3]: 13 #还可以使用负数作为索引 In [4]: a[-4] Out[4]: 12 #方括号中传入多数索引值,可同时选择多个