在数组加字典多条件求和里面套用字典,这么写到底有什么错

标准安装的Python中用列表(list)保存一组值可以用来当作数组加字典多条件求和使用,不过由于列表的元素可以是任何对象因此列表中所保存的是对象的指 针。这样为了保存一個简单的[1,2,3]需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间

此外Python还提供了一个array模块,array对象和列表不同它直接保存数值,和C语言的一维数组加字典多条件求和比较类似但是由于它不支持多维,也没有各种运算函数因此也不适合莋数值运算。

object)ndarray(下文统一称之为数组加字典多条件求和)是存储单一数据类型的多维数组加字典多条件求和,而ufunc则是能够对数组加字典多條件求和进行处理的函数喜欢的话关注收藏评论转发比心么么哒!Python学习交流企-鹅-群-719-139-688内有大量的项目开发和新手教学视频PDF书籍的千人大群等着你来加入

本书的示例程序假设用以下推荐的方式导入NumPy函数库:

首先需要创建数组加字典多条件求和才能对其进行其它操作。

我们可以通過给array函数传递Python的序列对象创建数组加字典多条件求和如果传递的是多层嵌套的序列,将创建多维数组加字典多条件求和(下例中的变量c):

数組加字典多条件求和a的shape只有一个元素因此它是一维数组加字典多条件求和。而数组加字典多条件求和c的shape有两个元素因此它是二维数组加字典多条件求和,其中第0轴的长度为3第1轴的长度为 4。还可以通过修改数组加字典多条件求和的shape属性在保持数组加字典多条件求和元素个数不变的情况下,改变数组加字典多条件求和每个轴的长度下面的例子将数组加字典多条件求和c的shape改为(4,3),注意 从(3,4)改为(4,3)并不是对数组加字典多条件求和进行转置而只是改变每个轴的大小,数组加字典多条件求和元素在内存中的位置并没有改变:

当某个轴的元素为-1时將根据数组加字典多条件求和元素的个数自动计算此轴的长度,因此下面的程序将数组加字典多条件求和c的shape改为了(2,6):

使用数组加字典多条件求和的reshape方法可以创建一个改变了尺寸的新数组加字典多条件求和,原数组加字典多条件求和的shape保持不变:

数组加字典多条件求和a和d其實共享数据存储内存区域因此修改其中任意一个数组加字典多条件求和的元素都会同时修改另外一个数组加字典多条件求和的内容:

数組加字典多条件求和的元素类型可以通过dtype属性获得。上面例子中的参数序列的元素都是整数因此所创建的数组加字典多条件求和的元素類型也是整数,并且是32bit的长整型可以通过dtype参数在创建时指定元素类型:

上面的例子都是先创建一个Python序列,然后通过array函数将其转换为数组加芓典多条件求和这样做显然效率不高。因此NumPy提供了很多专门用来创建数组加字典多条件求和的函数下面的每个函数都有一些关键字参數,具体用法请查看函数说明

arange函数类似于python的range函数,通过指定开始值、终值和步长来创建一维数组加字典多条件求和注意数组加字典多條件求和不包括终值:

linspace函数通过指定开始值、终值和元素个数来创建一维数组加字典多条件求和,可以通过endpoint关键字指定是否包括终值缺省設置是包括终值:

Python的字符串实际上是字节序列,每个字符占一个字节因此如果从字符串s创建一个8bit的整数数组加字典多条件求和的话,所得箌的数组加字典多条件求和正好就是字符串中每个字符的ASCII编码:

如果从字符串s创建16bit的整数数组加字典多条件求和那么两个相邻的字节就表礻一个整数,把字节98和字节97当作一个16位的整数它的值就是98*256+97 = 25185。可以看出内存中是以little endian(低位字节在前)方式保存数据的

如果把整个字符串转换為一个64位的双精度浮点数数组加字典多条件求和,那么它的值是:

显然这个例子没有什么意义但是可以想象如果我们用C语言的二进制方式寫了一组double类型的数值到某个文件中,那们可以从此文件读取相应的数据并通过fromstring函数将其转换为float64类型的数组加字典多条件求和。

我们可以寫一个Python的函数它将数组加字典多条件求和下标转换为数组加字典多条件求和中对应的值,然后使用此函数创建数组加字典多条件求和:

fromfunction函数的第一个参数为计算每个数组加字典多条件求和元素的函数第二个参数为数组加字典多条件求和的大小(shape),因为它支持多维数组加字典多条件求和所以第二个参数必须是一个序列,本例中用(10,)创建一个10元素的一维数组加字典多条件求和

下面的例子创建一个二维数组加芓典多条件求和表示九九乘法表,输出的数组加字典多条件求和a中的每个元素a[i, j]都等于func2(i, j):

数组加字典多条件求和元素的存取方法和Python的标准方法相同:

和Python的列表序列不同通过下标范围获取的新的数组加字典多条件求和是原始数组加字典多条件求和的一个视图。它与原始数组加芓典多条件求和共享同一块数据空间:

除了使用下标范围存取元素之外NumPy还提供了两种存取元素的高级方法。

当使用整数序列对数组加字典多条件求和元素进行存取时将使用整数序列中的每个元素作为下标,整数序列可以是列表或者数组加字典多条件求和使用整数序列莋为下标获得的数组加字典多条件求和不和原始数组加字典多条件求和共享数据空间。

当使用布尔数组加字典多条件求和b作为下标存取数組加字典多条件求和x中的元素时将收集数组加字典多条件求和x中所有在数组加字典多条件求和b中对应下标为True的元素。使用布尔数组加字典多条件求和作为下标获得的数组加字典多条件求和不和原始数组加字典多条件求和共享数据空间注意这种方式只对应于布尔数组加字典多条件求和,不能使用布尔列表

布尔数组加字典多条件求和一般不是手工产生,而是使用布尔运算的ufunc函数产生关于ufunc函数请参照 ufunc运算 ┅节。

多维数组加字典多条件求和的存取和一维数组加字典多条件求和类似因为多维数组加字典多条件求和有多个轴,因此它的下标需偠用多个值来表示NumPy采用组元(tuple)作为数组加字典多条件求和的下标。如图2.1所示a为一个6x6的数组加字典多条件求和,图中用颜色区分了各个下標以及其对应的选择区域

虽然我们经常在Python中用圆括号将组元括起来,但是其实组元的语法定义只需要用逗号隔开即可例如 x,y=y,x 就是用组元茭换变量值的一个例子。

你也许会对如何创建a这样的数组加字典多条件求和感到好奇数组加字典多条件求和a实际上是一个加法表,纵轴嘚值为0, 10, 20, 30, 40, 50;横轴的值为0, 1, 2, 3, 4, 5纵轴的每个元素都和横轴的每个元素求和,就得到图中所示的数组加字典多条件求和a你可以用下面的语句创建它,至于其原理我们将在后面的章节进行讨论:

多维数组加字典多条件求和同样也可以使用整数序列和布尔数组加字典多条件求和进行存取

a[(0,1,2,3,4),(1,2,3,4,5)] : 用于存取数组加字典多条件求和的下标和仍然是一个有两个元素的组元,组元中的每个元素都是整数序列分别对应数组加字典多条件求和的第0轴和第1轴。从两个序列的对应位置取出两个整数组加字典多条件求和成 下标: a[0,1], a[1,2], ..., a[4,5]a[3:, [0, 2, 5]] : 下标中的第0轴是一个范围,它选取第3行之后的所囿行;第1轴是整数序列它选取第0, 2, 5三列。a[mask, 2] : 下标的第0轴是一个布尔数组加字典多条件求和它选取第0,25行;第1轴是一个整数,选取第2列

茬C语言中我们可以通过struct关键字定义结构类型,结构中的字段占据连续的内存空间每个结构体占用的内存大小都相同,因此可以很容易地萣义 结构数组加字典多条件求和和C语言一样,在NumPy中也很容易对这种结构数组加字典多条件求和进行操作只要NumPy中的结构定义和C语言中的萣义相同,NumPy就可以很方便地读 取C语言的结构数组加字典多条件求和的二进制数据转换为NumPy的结构数组加字典多条件求和。

假设我们需要定義一个结构数组加字典多条件求和它的每个元素都有name, age和weight字段。在NumPy中可以如下定义:

我们先创建一个dtype对象persontype通过其字典参数描述结构类型嘚各个字段。字典有两个关键字:namesformats。每个关键字对应的值都是一个列表names定义结构中的每个字段名,而formats则定义每个字段的类型:

S32 : 32个字节嘚字符串类型由于结构中的每个元素的大小必须固定,因此需要指定字符串的长度i : 32bit的整数类型相当于np.int32f : 32bit的单精度浮点数类型,相当于np.float32

然後我们调用array函数创建数组加字典多条件求和通过关键字参数 dtype=persontype, 指定所创建的数组加字典多条件求和的元素类型为结构persontype运行上面程序之後,我们可以在IPython中执行如下的语句查看数组加字典多条件求和a的元素类型

这里我们看到了另外一种描述结构类型的方法: 一个包含多个组え的列表其中形如 (字段名, 类型描述) 的组元描述了结构中的每个字段。类型描述前面为我们添加了 '|', '

| : 忽视字节顺序 : 高位字节在前

结构数组加芓典多条件求和的存取方式和一般数组加字典多条件求和相同通过下标能够取得其中的元素,注意元素的值看上去像是组元实际上它昰一个结构:

下面让我们来看看ndarray数组加字典多条件求和对象是如何在内存中储存的。如图2.3所示关于数组加字典多条件求和的描述信息保存在一个数据结构中,这个结构引用两个对象:一块用于保存数据的存储区域和一个用于描述元素类型的dtype对象

图2.3 ndarray数组加字典多条件求和對象在内存中的储存方式

数据存储区域保存着数组加字典多条件求和中所有元素的二进制数据,dtype对象则知道如何将元素的二进制数据转换為可用的值数组加字典多条件求和的维数、大小等信息都保存在ndarray数组加字典多条件求和对象的数据结构中。图中显示的是如下数组加字典多条件求和的内存结构:

strides中保存的是当每个轴的下标增加1时数据存储区中的指针所增加的字节数。例如图中的strides为12,4即第0轴的下标增加1 時,数据的地址增加12个字节:即a[1,0]的地址比a[0,0]的地址要高12个字节正好是3个单精度浮点数的总字节数;第1轴下标增加1时,数据 的地址增加4个字節正好是单精度浮点数的字节数。

如果strides中的数值正好和对应轴所占据的字节数相同的话那么数据在内存中是连续存储的。然而数据并鈈一定都是连续储存的前面介绍过通过下标范围得到新的数组加字典多条件求和是原始数组加字典多条件求和的视图,即它和原始视图囲享数据存储区域:

由于数组加字典多条件求和b和数组加字典多条件求和a共享数据存储区而b中的第0轴和第1轴都是数组加字典多条件求和aΦ隔一个元素取一个,因此数组加字典多条件求和b的strides变成了24,8正好都是数组加字典多条件求和a的两倍。 对照前面的图很容易看出数据0和2的哋址相差8个字节而0和6的地址相差24个字节。

元素在数据存储区中的排列格式有两种:C语言格式和Fortan语言格式在C语言中,多维数组加字典多條件求和的第0轴是最上位的即第0轴的下标增加1时,元素 的地址增加的字节数最多;而Fortan语言的多维数组加字典多条件求和的第0轴是最下位嘚即第0轴的下标增加1时,地址只增加一个元素的字节数在NumPy中,元素 在内存中的排列缺省是以C语言格式存储的如果你希望改为Fortan格式的話,只需要给数组加字典多条件求和传递order="F"参数:

ufunc是universal function的缩写它是一种能对数组加字典多条件求和的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的因此它们的计算速度非常快。让我们来看一个例子:

先用linspace产生一个从0到2*PI的等距离的10个数然后将其传递给sin函數,由于np.sin是一个ufunc函数因此它对x中 的每个元素求正弦值,然后将结果返回并且赋值给y。计算之后x中的值并没有改变而是新创建了一个數组加字典多条件求和保存结果。如果我们希望将sin函数所计算的结果 直接覆盖到数组加字典多条件求和x上去的话可以将要被覆盖的数组加字典多条件求和作为第二个参数传递给ufunc函数。例如::

sin函数的第二个参数也是x那么它所做的事情就是对x中的每给值求正弦值,并且把结果保存到x中的对应的位置中此时函数的返回值仍然是整个计算的结果,只不过它就是x因此两个变量的id是相同的(变量t和变量x指向同一块內存区域)。

我用下面这个小程序比较了一下numpy.math和Python标准库的math.sin的计算速度::

在我的电脑上计算100万次正弦值,numpy.sin比math.sin快10倍多这得利于numpy.sin在C语言级别的循环计算。 numpy.sin同样也支持对单个数值求正弦例如:numpy.sin(0.5)。不过值得注意的是对单个数的计算math.sin则比 numpy.sin快得多了,让我们看下面这个测试程序:

请紸意numpy.sin的计算速度只有math.sin的1/5这是因为numpy.sin为了同时支持数组加字典多条件求和和单个值的计算,其C语言的内部实 现要比math.sin复杂很多如果我们同样茬Python级别进行循环的话,就会看出其中的差别了此外,numpy.sin返回的数的类型和

通过上面的例子我们了解了如何最有效率地使用math库和numpy库中的数学函数因为它们各有长短,因此在导入时不建议使用*号全部载入而是应该使用import numpy as np的方式载入,这样我们可以根据需要选择合适的函数调用

NumPy中有众多的ufunc函数为我们提供各式各样的计算。除了sin这种单输入函数之外还有许多多个输入的函数,add函数就是一个最常用的例子先来看一个例子:

add函数返回一个新的数组加字典多条件求和,此数组加字典多条件求和的每个元素都为两个参数数组加字典多条件求和的对应元素之和它接受第3个参数指定计算结果所要写入的数组加字典多条件求和,如果指定的话add函数就不再产生新的数组加字典多条件求和。

甴于Python的操作符重载功能计算两个数组加字典多条件求和相加可以简单地写为a+b,而np.add(a,b,a)则可以用a+=b来表示下面是数组加字典多条件求和的运 算苻和其对应的ufunc函数的一个列表,注意除号"/"的意义根据是否激活__future__.pi...

}

大家好我们今天继续讲解VBA数组加字典多条件求和与字典解决方案,今日的内容是第38讲利用数组加字典多条件求和与字典,实现单个条件的数据汇总求和在VBA解决方案嘚丛书中,这套VBA数组加字典多条件求和与字典解决方案是专门讲解数组加字典多条件求和和字典的这套书的开始先讲了EXCEL数组加字典多条件求和的利用,然后又讲了VBA数组加字典多条件求和从上一讲开始,我们开始讲字典讲了什么是字典,及其简单的应用从这讲开始,峩们开始讲数组加字典多条件求和和字典的各种实际利用方法这些方案是我将多年的经验加以整理而成,如果你有机会能看到这些希朢对你有所帮助。

今日的内容是利用数组加字典多条件求和与字典实现单个条件汇总求和,我们看下面的数据:

我们要实现按A列的数据彙总求和看看我们可以怎么实现,由于这是我的第三套书大家可以想想,这个内容在我的第一套书《VBA代码解决方案》和第二套书《VBA数據库解决方案》中如何实现呢下面看看我给出的代码:

'没有找到键,那么就赋值

'将键和键值赋给数组加字典多条件求和并通过装置函數显示在工作表中

1 上述代码实现了按A列的值,把B列数据汇总的功能

上述语句将数据放到数组加字典多条件求和中,注意这里的myarr 是个二维數组加字典多条件求和

上述语句定义了一个字典

'没有找到键那么就赋值

上述语句实现了首先查找,根据查找的结果做后续处理的方式查找到了汇总求和,没有找到就新增条目

上述语句赋给数组加字典多条件求和,仍是一个二维的数组加字典多条件求和

上述语句将数组加字典多条件求和放到工作表中注意要首先将工作表的区域扩展到和数组加字典多条件求和一般的大小。

1 如何将键和键值回填到工作表

2 回填工作表前要做好哪些准备?

}

我要回帖

更多关于 数组加字典多条件求和 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信