热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何将intnumpy数组的列乘以float数字并保持int?

如何解决《如何将intnumpy数组的列乘以float数字并保持int?》经验,为你挑选了1个好方法。

我有一个numpy数组:

 >>> b
 array([[ 2,  2],
        [ 6,  4],
        [10,  6]])

我想将第一列乘以浮点数,结果我需要int数,因为当我这样做时:

>>> b[:,0] *= 2.1

它说:

TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int64') with casting rule 'same_kind'

我需要看起来像这样的数组:

array([[ 4,  2],
       [12,  4],
       [21,  6]])

andrew_reece.. 6

@Umang Gupta解决了你的问题.我很好奇为什么这个有用,所以我发布了我发现的附加上下文.FWIW这个问题已经在这里被问到并回答了,但是这个答案也没有像我希望的那样真正地了解正在发生的事情,所以这是我的尝试:

使用*=运算符调用__imul__()Numpy ndarrays的就地乘法的特殊方法,后者又调用通用函数(ufunc)multiply().

这里有两个multiply()相关的参数:outcasting.

所述out参数指定的输出(与它的类型一起).在就地乘法运算符中,out设置为self,即ndarray调用乘法运算的对象.特别是,确切的调用了*=这个样子的:

ufunc(self, other, out=(self,))

^ where ufunc = multiply,self = b(ndarray,type int64,and other = 2.1(scalar,type float)

casting但是,该参数确定了由于操作而允许哪种数据类型转换的规则. 从Numpy 1.10开始,默认值为castingis same_kind,表示:

只允许使用float64到float32之类的安全转换或类型转换

由于我们的ufunc电话没有指定的值casting参数,默认值(same_kind)用于-但因为我们这会导致问题已经指定out为具有int64D型细胞,这是不是同一种与int-通过流通倍增的输出.使用same_kind强制转换时,float操作的结果无法转换为int.这就是我们看到这个错误的原因.

我们可以使用multiply()显式复制此错误:

np.multiply(b, 2.1, out=b)
TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int64') with casting rule 'same_kind'  

通过设置参数值可以放宽casting要求.然后,当设置时,输出被强制转换为类型,无论它是否相同(如果可能):multiply()"unsafe"outout

np.multiply(b, 2.1, out=b, casting="unsafe")
# specifying int output and allowing casting to be "unsafe" allows re-conversion to int
array([[ 4,  4],
       [12,  8],
       [21, 12]])

b[:,0]另一方面,使用常规赋值运算符进行更新是可以的.这就是@Umang Gupta的解决方案.
附:

b[:,0] = b[:,0]* 2.1

*调用multiplyufunc,就像调用一样*=.但由于它没有调用操作的原位版本,因此没有out指定参数,因此输出没有设置类型.然后,标准类型转换允许整数向上浮动:

np.multiply(b, 2.1)
# float output
array([[  4.2,   4.2],
       [ 12.6,   8.4],
       [ 21. ,  12.6]])

然后,正常赋值运算符=获取乘法的输出并将其存储b[:,0].根据Numpy文档为索引数组赋值:

请注意,如果将较高类型分配给较低类型(如浮点数到整数),则分配可能会导致更改

所以,问题的关键在于*=运营商的自动的设定out参数不改变casting从论证same_kindunsafe.(并不是说这是一个错误,只是因为这就是你得到错误的原因.)并且通过利用Numpy中赋值的自动"向下转换"属性,接受的解决方案可以解决这个问题.希望有所帮助!(另外,Numpy专业人士,请随时纠正我的任何误解.)



1> andrew_reece..:

@Umang Gupta解决了你的问题.我很好奇为什么这个有用,所以我发布了我发现的附加上下文.FWIW这个问题已经在这里被问到并回答了,但是这个答案也没有像我希望的那样真正地了解正在发生的事情,所以这是我的尝试:

使用*=运算符调用__imul__()Numpy ndarrays的就地乘法的特殊方法,后者又调用通用函数(ufunc)multiply().

这里有两个multiply()相关的参数:outcasting.

所述out参数指定的输出(与它的类型一起).在就地乘法运算符中,out设置为self,即ndarray调用乘法运算的对象.特别是,确切的调用了*=这个样子的:

ufunc(self, other, out=(self,))

^ where ufunc = multiply,self = b(ndarray,type int64,and other = 2.1(scalar,type float)

casting但是,该参数确定了由于操作而允许哪种数据类型转换的规则. 从Numpy 1.10开始,默认值为castingis same_kind,表示:

只允许使用float64到float32之类的安全转换或类型转换

由于我们的ufunc电话没有指定的值casting参数,默认值(same_kind)用于-但因为我们这会导致问题已经指定out为具有int64D型细胞,这是不是同一种与int-通过流通倍增的输出.使用same_kind强制转换时,float操作的结果无法转换为int.这就是我们看到这个错误的原因.

我们可以使用multiply()显式复制此错误:

np.multiply(b, 2.1, out=b)
TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int64') with casting rule 'same_kind'  

通过设置参数值可以放宽casting要求.然后,当设置时,输出被强制转换为类型,无论它是否相同(如果可能):multiply()"unsafe"outout

np.multiply(b, 2.1, out=b, casting="unsafe")
# specifying int output and allowing casting to be "unsafe" allows re-conversion to int
array([[ 4,  4],
       [12,  8],
       [21, 12]])

b[:,0]另一方面,使用常规赋值运算符进行更新是可以的.这就是@Umang Gupta的解决方案.
附:

b[:,0] = b[:,0]* 2.1

*调用multiplyufunc,就像调用一样*=.但由于它没有调用操作的原位版本,因此没有out指定参数,因此输出没有设置类型.然后,标准类型转换允许整数向上浮动:

np.multiply(b, 2.1)
# float output
array([[  4.2,   4.2],
       [ 12.6,   8.4],
       [ 21. ,  12.6]])

然后,正常赋值运算符=获取乘法的输出并将其存储b[:,0].根据Numpy文档为索引数组赋值:

请注意,如果将较高类型分配给较低类型(如浮点数到整数),则分配可能会导致更改

所以,问题的关键在于*=运营商的自动的设定out参数不改变casting从论证same_kindunsafe.(并不是说这是一个错误,只是因为这就是你得到错误的原因.)并且通过利用Numpy中赋值的自动"向下转换"属性,接受的解决方案可以解决这个问题.希望有所帮助!(另外,Numpy专业人士,请随时纠正我的任何误解.)


推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
author-avatar
全球时_尚热门焦点吧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有